2012-05-30 12 views

Respuesta

5

El comando error produce un error justo en el punto actual; es ideal para los casos en que está generando un problema debido al estado interno de un procedimiento. El comando return -code error hace que el procedimiento en el que se coloca produzca un error (como si el procedimiento fuera error); es genial para el caso donde hay un problema con los argumentos pasados ​​al procedimiento (es decir, la persona que llama hizo algo mal). La diferencia realmente viene cuando observas el rastro de la pila.

Aquí hay un ejemplo (ideado!):

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

También hay diferencias si utiliza 'catch' dentro del procedimiento para atrapar a los dos casos diferentes, pero que está consiguiendo mucho más compleja. –

+1

Probablemente también vale la pena mencionar que desde Tcl 8.5 'return' aprendió la opción' -level' que podría usarse para generar un error en algún lugar más arriba de la pila, que puede usarse al implementar comandos complejos personalizados (usualmente pretendiendo formar una DSL) 'error' no puede hacer eso. – kostix

Cuestiones relacionadas