有没有办法捕获全局“Tcl解释器错误”?例如,我想在一些文件中自动存储后面的消息。
答案 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文档,它有一个简单的例子。