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