在tcl脚本中的任何tcl错误上添加回调命令?

时间:2011-05-25 09:32:29

标签: tcl tk

是否可以在tcl脚本中指定用户定义的错误命令? 如果有任何错误,我想清理内存。我知道最后一个错误保存在errorInfo变量中。

3 个答案:

答案 0 :(得分:4)

目前还不是很清楚你真正想做什么。

您可以使用catch命令捕获任何错误。如果您需要它在顶层工作,您可以在catch下评估脚本的其余部分,例如

catch {
  source ./the_rest_of_the_code.tcl
} err

对于异步程序(那些使用事件循环,包含Tk的程序),并不是那么容易,因为在回调中可能会引发意外错误。要处理那些查看bgerror命令。

答案 1 :(得分:3)

另一种方法是在leavestep模式下使用执行跟踪,它允许您测试每个命令执行是否失败,并确定发生时该怎么办。 (这与AOP中某些类型的方面可以做的很相似。)

proc doIt {} {
    namespace eval :: {
        # Your real code goes in here
    }
}
trace add execution doIt leavestep {::apply {{cmd cmdArgs code result op} {
    if {$code == 1} {#0 == ok, 1 == error
        puts "ERROR >>$result<< from $cmdArgs"
    }
}}}
doIt

虽然这很慢。

答案 2 :(得分:1)

您还可以定义bgerror程序并将代码作为后台任务调用:

proc bgerror { msg } {
  puts "bgerror:$msg"
  # Cleanup code here
}

proc troubleCode { } { 
  adjsad s ahda 
}

after 1 troubleCode