抓住"Tcl解释器错误"

ily*_*725 5 tcl

有没有办法赶上全球"Tcl解释器错误"?例如,我想在一些文件中自动存储后面的消息.

Don*_*ows 6

用于捕获Tcl抛出的任何类型错误的核心命令是catch.它至少需要一个参数,一个要评估的脚本,并从评估该脚本返回结果代码.结果代码是1在发生错误时,0没有错误时,以及其他情况下的一堆其他内容(表示其他类型的通常非错误异常).的catch也有一个可选的参数名称的可变到其中的写评估脚本的结果错误消息.errorInfo如果出现错误,全局变量将包含堆栈跟踪(或者从8.5开始,您可以获得传递给其他变量名称的解释器状态字典catch).

要在某些脚本"foo.tcl"中捕获错误,您可以使用以下代码:

if {[catch {source foo.tcl} msg]} {
    puts "I got an error: $msg"
    puts "The stack trace was this:\n$errorInfo"
}
Run Code Online (Sandbox Code Playgroud)

如果你愿意,可以自行决定如何将其写入文件.(我用这个技术与实现仔细测试错误陷阱,它加载的内部脚本,做实际的工作.我觉得效果很好.或者你可以调用在"中招"的脚本程序的外部脚本,最多你真的; Tcl应该使所有错误都可以捕获,并且很少有条件可以通过.)


可以报​​告错误的另一个路径是via bgerror,调用它来处理事件处理期间发生的错误.这是一个程序,你可以编写自己的版本; 当被调用时,它将被赋予一个参数,即错误消息,并且errorInfo在调用时将正确设置全局:

proc bgerror {msg} {
    global errorInfo
    puts "I got an error in an event: $msg"
    puts "The stack trace was this:\n$errorInfo"
}
Run Code Online (Sandbox Code Playgroud)

如果没有bgerror定义的实现,则只将堆栈跟踪写入stderr通道.如果您正在使用Tk包,bgerror则会提供一个实现,其中会弹出一个描述问题的对话框.