Tcl异常处理命令之error、return

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中的值提供。
-levellevel值必须是一个非负整数,表示调用堆栈上的多个级别。它定义了当前正在执行的命令的返回代码所在的堆栈的层数。如果没有指定此选项,则默认为1。
-options选项值选项必须是一个有效的字典。字典的条目被视为是return命令额外的option value对。
-errorstackTcl8.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
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值