catch
catch script ?resultVarName? ?optionsVarName?
catch可以防止错误中止命令解释。如果脚本script引发错误,catch命令返回与执行script返回的异常返回代码对应的非零整数值。Tcl将脚本执行的正常返回代码定义为0或TCL_OK。此外还定义了四个异常的返回代码:
返回代码 | 说明 |
1(TCL_ERROR) | 表示脚本执行过程中的错误。 |
2(TCL_RETURN) | 由return命令返回。 |
3(TCL_BREAK) | 由break命令返回。 |
4(TCL_CONTINUE) | 由continue命令返回。 |
Tcl库还可以定义返回其他整数值做为返回代码的新命令。script中使用return命令的-code选项还可以返回Tcl定义的5个返回代码之外的返回代码。
如果提供了resultVarName,则脚本的执行结果保存到名为resultVarName的变量中。如果返回代码是1,则其中保存的是错误信息。当返回代码是0时,保存的是脚本的返回值。
如果提供了optionsVarName,则脚本执行返回的返回选项字典保存到名为optionsVarName的变量中。字典中始终包含两个条目:-code和-level。当脚本的返回代码不是TCL_RETURN时,-level的值为0,-code的值与返回代码相同。只有当返回代码为TCL_RETURN时,-level和-code的值才会是其他值。当脚本的返回代码为TCL_ERROR时,在optionsVarName中存储的返回选项字典中定义了另外三个条目:-errorinfo、-errorcode和-errorline。errorinfo的值是一个格式化的堆栈跟踪,包含有关发生错误的上下文的更多信息。errorcode的值是关于错误的额外信息的列表。errorline的值是发生错误的脚本行数。errorcode与errorinfo的值同时被保存到全局变量errorcode和errorinfo中。
Tcl8.6起,当脚本的返回代码为TCL_ERROR时,optionsVarName中存储的返回选项字典中增加了一个条目:-errorstack。errorstack的值由在展开堆栈时积累的token-parameter对组成的偶数大小的列表。
if { [catch { expr 1/0 } msg opts] } {
puts $msg
foreach {k v } $opts {
puts "$k==$v"
}
}