有没有办法捕捉到全局的"Tcl解释器错误“?例如,我想自动将下面的消息存储在某个文件中。
发布于 2012-03-31 19:53:31
捕获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"
}如果你愿意,你可以决定如何把它写到一个文件中。(我将这种技术与一个外部脚本结合使用,该脚本实现了一个经过仔细测试的错误陷阱,并加载了一个执行实际工作的内部脚本。我发现它工作得很好。或者,您可以调用“caught”脚本中的过程。真的由您决定;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实现,其中会弹出一个描述问题的对话框。
发布于 2012-03-31 06:46:47
尝试使用bgerror或interp bgerror命令。
请阅读bgerror文档,其中有一个简单的示例。
https://stackoverflow.com/questions/9950461
复制相似问题