Tcl异常处理命令之error、return
程序员文章站
2024-03-25 18:56:10
...
error
error message ?info? ?code?
返回代码TCL_ERROR,并导致命令解释中止。message是返回给应用程序的字符串,用于指示错误信息。解释器的返回选项-errorinfo存储了程序发生错误时累积的堆栈跟踪信息。
如果提供了info,则使用它初始化返回选项-errorinfo,并且Tcl解释器不会添加展开信息的第一个增量,即包含error命令的命令不会出现在堆栈跟踪信息中,而是提供的info。如果没有提供,则包含error命令的命令会出现在堆栈跟踪信息中。
如果提供了cide,则使用它初始化返回选项-errorcode,返回选项errorcode是用来提供机器可读的错误描述信息。如果不提供默认为NONE。
catch {expr 1/0} errMsg opts
puts $errMsg
puts $opts
set oriErrorInfo $errorInfo
catch {error $errMsg "error for divide by 0" } newErrMsg newOpts
puts $newErrMsg
puts $newOpts
catch {error $errMsg $oriErrorInfo MATHERROR } newErrMsg newOpts
puts $newErrMsg
puts $newOpts
return
return ?result?
return ?-code code? ?result?
return ?option value ...? ?result?
从过程返回,或设置脚本的返回代码。return的最简单用法是在过程主体中不带任何参数,用于立即将控制权交给过程的调用者。如果指定了result,则作为过程的结果传递给过程的调用者。如果没有指定result则返回结果为空字符串。在由source命令执行的脚本文件中return提供相似的功能。当source将文件内容作为脚本执行时,调用return命令将导致脚本执行立即停止,result会作为source的结果返回。
-code选项用于设置过程的返回代码,如果不指定-code,过程可以正常返回,如果指定-code,则可以返回异常。Tcl定义了如下5种返回代码:
返回代码 | 说明 |
ok(0) | 与没有提供code时一样,过程正常返回,返回代码为0。 |
error(1) | 过程命令的行为就像error命令一样,返回代码为1。 |
return(2) | 过程命令的行为就像return命令一样,返回代码为2。 |
break(3) | 过程命令的行为就像break命令一样,返回代码为3。 |
continue(4) | 过程命令的行为就像continue命令一样,返回代码为4。 |
除了以上5种返回代码外,返回代码还可以是其他任何整数,它将作为当前过程的返回代码返回。
除了返回结果和但会代码之外,还可以返回Tcl生成的返回选项字典。Tcl定义了以下返回选项:
返回选项 | 说明 |
-errorcode | 只有当-code选项的值为TCL_ERROR时,才会对-errorcode选项进行特殊处理。错误的额外信息以Tcl列表的形式保存。如果-code为error,但是没有提供此选项时,Tcl会将返回选项字典中的-errorcode设置为NONE。此选项值也会保存到全局变量errorCode中。 |
-errorinfo | 只有当-code选项的值为TCL_ERROR时,才会对-errorinfo选项进行特殊处理。其值为堆栈跟踪信息,用于提供人类可读的错误发生时上下文信息。如果-code为error,但是没有提供此选项时,Tcl会将返回选项字典中的-errorcode设置为Tcl的初始堆栈跟踪信息。Tcl的初始堆栈跟踪将只包含对过程的调用,堆栈展开将附加关于更高堆栈级别的信息,但是过程中没有关于错误上下文的信息。此选项值也会保存到全局变量errorInfo中。此选项值通常由catch命令捕获的返回选项字典中的-errorinfo值或者保存在全局变量errorInfo中的值提供。 |
-level | level值必须是一个非负整数,表示调用堆栈上的多个级别。它定义了当前正在执行的命令的返回代码所在的堆栈的层数。如果没有指定此选项,则默认为1。 |
-options | 选项值选项必须是一个有效的字典。字典的条目被视为是return命令额外的option value对。 |
-errorstack | Tcl8.6新增的选项,只有当-code选项的值为TCL_ERROR时,才会对-errorstack选项进行特殊处理。选项值为记录传递给每个proc级别的实际参数的错误堆栈。错误堆栈还可以通过info errorstack命令访问。如果-code为error,但是没有提供此选项时,Tcl会将返回选项字典中的-errorstack设置为Tcl的初始堆栈跟踪信息。Tcl的初始堆栈跟踪将只包含对过程的调用,堆栈展开将附加关于更高堆栈级别的信息,但是过程中没有关于错误上下文的信息。此选项值通常由catch命令捕获的返回选项字典中的-errorstack值或者info errorstack命令的值提供。 |
proc testReturn {} {
puts testReturn
return
puts b
}
set a [ testReturn ]
puts $a
proc testReturnWithResult {} {
puts testReturnWithResult
return testResult
}
set a [ testReturnWithResult ]
puts $a
proc testReturnWithCode {} {
puts testReturnWithCode
return -code return
}
catch { testReturnWithCode } errMsg opts
puts $errMsg
puts $opts
proc testReturnWithAll {} {
puts testReturnWithAll
catch { expr 1/0 } errMsg opt
return -errorcode {MATHERROR} -errorInfo $::errorInfo -code 1 "invoke error"
}
catch {testReturnWithAll} errMsg1 opts
puts $errMsg1
puts $opts