首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获"Tcl解释器错误“

问捕获"Tcl解释器错误“
EN

Stack Overflow用户
提问于 2012-03-31 05:10:36
回答 2查看 3.6K关注 0票数 5

有没有办法捕捉到全局的"Tcl解释器错误“?例如,我想自动将下面的消息存储在某个文件中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-31 19:53:31

捕获Tcl抛出的任何类型的错误的核心命令是catch。它至少接受一个参数,即一个要计算的脚本,并返回计算该脚本的结果代码。当出现错误时,结果代码为1;当没有错误时,结果代码为0;在其他情况下,结果代码为一堆其他代码(表示其他类型的通常无错误的异常)。catch还接受一个可选参数,该参数命名一个变量,将脚本或错误消息的计算结果写入该变量。在发生错误时,全局变量errorInfo将包含堆栈跟踪(或者从8.5后,您可以使用传递给catch的另一个变量名获得解释器状态字典)。

要捕获某个脚本“foo.tcl”中的错误,您可以使用如下代码:

代码语言:javascript
复制
if {[catch {source foo.tcl} msg]} {
    puts "I got an error: $msg"
    puts "The stack trace was this:\n$errorInfo"
}

如果你愿意,你可以决定如何把它写到一个文件中。(我将这种技术与一个外部脚本结合使用,该脚本实现了一个经过仔细测试的错误陷阱,并加载了一个执行实际工作的内部脚本。我发现它工作得很好。或者,您可以调用“caught”脚本中的过程。真的由您决定;Tcl应该使所有错误都是可捕获的,并且很少有条件会被忽略。)

可以报告错误的另一种方法是通过bgerror,它被调用来处理在事件处理期间发生的错误。这是一个您可以编写自己版本的过程;它在被调用时将被赋予一个参数,这就是错误消息,并且在被调用时将正确地设置全局errorInfo:

代码语言:javascript
复制
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实现,其中会弹出一个描述问题的对话框。

票数 6
EN

Stack Overflow用户

发布于 2012-03-31 06:46:47

尝试使用bgerror或interp bgerror命令。

请阅读bgerror文档,其中有一个简单的示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9950461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档