Tcl 什么';返回代码错误和错误之间的区别是什么

Tcl 什么';返回代码错误和错误之间的区别是什么,tcl,Tcl,通过返回-代码错误…在TCL中引发异常与错误…之间的实际区别是什么?什么时候使用一个而不是另一个?错误命令在当前点产生错误;对于由于程序的内部状态而引发问题的情况,它非常有用。 return-code error命令使其所在的过程产生错误(就好像该过程是error);对于传递给过程的参数有问题的情况(例如,调用方做了一些错误的事情),这是非常好的。 当您查看堆栈跟踪时,差异就出现了 下面是一个(人为的!)例子: 如果在过程中使用catch来捕获两种不同的情况,也会有差异,但这会变得更加复杂。可能

通过
返回-代码错误…
在TCL中引发异常与
错误…
之间的实际区别是什么?什么时候使用一个而不是另一个?

错误
命令在当前点产生错误;对于由于程序的内部状态而引发问题的情况,它非常有用。
return-code error
命令使其所在的过程产生错误(就好像该过程是
error
);对于传递给过程的参数有问题的情况(例如,调用方做了一些错误的事情),这是非常好的。 当您查看堆栈跟踪时,差异就出现了

下面是一个(人为的!)例子:


如果在过程中使用
catch
来捕获两种不同的情况,也会有差异,但这会变得更加复杂。可能还值得一提的是,由于Tcl 8.5
return
学习了
-level
选项,该选项可用于在堆栈的更高位置引发错误,可以在实现自定义复杂命令(通常假装形成DSL)时使用<代码>错误
无法执行此操作。
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"