是否可以防止在发生错误时输出调用堆栈。例如,假设:
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]
答案 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
的脚本内部,而不是在您显示的外部驱动程序代码中(这是绝对正常的,不需要调整我能想到)。