2012-05-30 10 views

risposta

5

Il comando error produce un errore proprio nel punto corrente; è ottimo per i casi in cui si genera un problema a causa dello stato interno di una procedura. Il comando return -code error rende la procedura in cui è stato inserito un errore (come se la procedura fosse error); è ottimo per il caso in cui c'è un problema con gli argomenti passati alla procedura (ad esempio, il chiamante ha fatto qualcosa di sbagliato). La differenza arriva quando guardi la traccia dello stack.

Ecco un esempio (escogitato!):

proc getNumberFromFile {filename} { 
    if {![file readable $filename]} { 
     return -code error "could not read $filename" 
    } 
    set f [open $filename] 
    set content [read $f] 
    close $f 
    if {![regexp -- {-?\d+} $content number]} { 
     error "no number present in $filename" 
    } 
    return $number 
} 

catch {getNumberFromFile no.such.file} 
puts $::errorInfo 
#could not read no.such.file 
# while executing 
#"getNumberFromFile no.such.file" 

catch {getNumberFromFile /dev/null} 
puts $::errorInfo 
#no number present in /dev/null 
# while executing 
#"error "no number present in $filename"" 
# (procedure "getNumberFromFile" line 9) 
# invoked from within 
#"getNumberFromFile /dev/null" 
+0

Ci sono anche differenze se si utilizza 'catch' all'interno della procedura per intrappolare i due casi diversi, ma che sta diventando molto più complessa. –

+1

Probabilmente vale anche la pena ricordare che dal momento che Tcl 8.5 'return' ha imparato l'opzione' -level' che potrebbe essere usata per generare un errore da qualche parte più in alto nello stack, che può essere usato quando si implementano comandi complessi personalizzati (di solito finta di formare una DSL). 'error' non può farlo. – kostix

Problemi correlati