抓住“Tcl解释器错误”

时间:2012-03-30 21:10:36

标签: tcl

有没有办法捕获全局“Tcl解释器错误”?例如,我想在一些文件中自动存储后面的消息。

2 个答案:

答案 0 :(得分: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"
}

如果您愿意,可以自行决定如何将其写入文件。 (我将这种技术与外部脚本一起使用,该脚本实现了经过仔细测试的错误陷阱,并加载了一个完成实际工作的内部脚本。我发现它运行良好。或者你可以调用那个“捕获”脚本中的程序。直到你真的; Tcl应该使所有错误都可以捕获,并且很少有条件可以通过。)


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

proc bgerror {msg} {
    global errorInfo
    puts "I got an error in an event: $msg"
    puts "The stack trace was this:\n$errorInfo"
}

如果没有定义bgerror的实现,则堆栈跟踪仅写入stderr通道。如果您使用的是Tk软件包,则会提供bgerror的实现,弹出一个描述问题的对话框。

答案 1 :(得分:1)

尝试使用bgerror或interp bgerror命令。

阅读bgerror文档,它有一个简单的例子。