0

发生错误时是否可以防止输出调用堆栈。因此,例如假设:

 set error [catch { [exec $interpName $tmpFileName] } err]
  if { $error ne 0 } {
  puts "err = $err" #<---- Here call stack is also outputted
} 

所以输出现在看起来像:

error: some error message

while executing
[stack trace]
4

1 回答 1

3

Tcl 自动在全局变量中构建调用堆栈errorInfo(从 8.5 开始,在-errorinfo解释器结果选项字典的成员中),但由调用代码决定如何处理它。的默认行为tclsh是打印出来;其他 Tcl 托管环境可以做不同的事情(通常建议将其打印出来,因为它有助于寻找错误;另一方面,一些程序 - 特别是 Eggdrop - 不这样做,这在调试脚本时会造成很多麻烦)。

catch您可以通过在出现原始错误的脚本中使用来自己控制它。最简单的方法是将真正的代码放在一个过程中(例如,main通过类比 C 和 C++ 调用),然后在外部使用一些驱动程序代码:

if {[catch {eval main $argv} msg]} {
    puts "ERROR: $msg"
    # What you're not doing at this point is:
    #    puts $errorInfo
    exit 1
} else {
    # Non-error case; adjust to taste
    puts "OK: $msg"
    exit 0
}

请注意,在您的代码中,这将进入您编写的脚本中,$tmpFileName而不是您显示的外部驱动程序代码中(这绝对没问题,不需要我能想到的调整)。

于 2013-06-24T09:24:40.853 回答