防止调用堆栈输出

时间:2013-06-24 09:12:34

标签: tcl

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

 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]

1 个答案:

答案 0 :(得分:2)

Tcl自动在全局变量errorInfo中构建调用堆栈(并且,自8.5以来,在解释器结果选项字典的-errorinfo成员中)但是由调用代码来决定该怎么做tclsh的默认行为是将其打印出来;其他Tcl托管环境可以做不同的事情(它通常推荐打印出来,因为它有助于追捕bug;另一方面,一些程序 - 特别是Eggdrop - 没有,它是一个原因调试脚本时遇到很多麻烦。)

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

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 的脚本内部,而不是在您显示的外部驱动程序代码中(这是绝对正常的,不需要调整我能想到)。