Tcl - Manejo de errores

El manejo de errores en Tcl se proporciona con la ayuda de error y catchcomandos. La sintaxis de cada uno de estos comandos se muestra a continuación.

Sintaxis de error

error message info code

En la sintaxis del comando de error anterior, mensaje es el mensaje de error, la información se establece en la variable global errorInfo y el código se establece en la variable global errorCode.

Sintaxis de captura

catch script resultVarName

En la sintaxis del comando catch anterior, script es el código que se ejecutará, resultVarName es la variable que contiene el error o el resultado. El comando catch devuelve 0 si no hay ningún error y 1 si hay un error.

A continuación se muestra un ejemplo de manejo simple de errores:

#!/usr/bin/tclsh

proc Div {a b} {
   if {$b == 0} {
      error "Error generated by error" "Info String for error" 401
   } else {
      return [expr $a/$b]
   }
}

if {[catch {puts "Result = [Div 10 0]"} errmsg]} {
   puts "ErrorMsg: $errmsg"
   puts "ErrorCode: $errorCode"
   puts "ErrorInfo:\n$errorInfo\n"
}

if {[catch {puts "Result = [Div 10 2]"} errmsg]} {
   puts "ErrorMsg: $errmsg"
   puts "ErrorCode: $errorCode"
   puts "ErrorInfo:\n$errorInfo\n"
}

Cuando se ejecuta el código anterior, produce el siguiente resultado:

ErrorMsg: Error generated by error
ErrorCode: 401
ErrorInfo:
Info String for error
   (procedure "Div" line 1)
   invoked from within
"Div 10 0"

Result = 5

Como puede ver en el ejemplo anterior, podemos crear nuestros propios mensajes de error personalizados. Del mismo modo, es posible detectar el error generado por Tcl. A continuación se muestra un ejemplo:

#!/usr/bin/tclsh

catch {set file [open myNonexistingfile.txt]} result
puts "ErrorMsg: $result"
puts "ErrorCode: $errorCode"
puts "ErrorInfo:\n$errorInfo\n"

Cuando se ejecuta el código anterior, produce el siguiente resultado:

ErrorMsg: couldn't open "myNonexistingfile.txt": no such file or directory
ErrorCode: POSIX ENOENT {no such file or directory}
ErrorInfo:
couldn't open "myNonexistingfile.txt": no such file or directory
   while executing
"open myNonexistingfile.txt"