2013-06-24 36 views
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] 

回答

2

Tcl的自動建立在全局變量errorInfo(和,因爲8.5調用堆棧,在解釋的-errorinfo成員結果選項字典),但由調用代碼決定如何處理它。 tclsh的默認行爲是打印出來;其他的Tcl-hosting環境可以做不同的事情(通常建議使用將它打印出來,因爲它有助於查找錯誤;另一方面,某些程序 - 特別是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的腳本中,這將會變爲,而不是你顯示的外部驅動程序代碼(這是非常好的,不需要我可以想象的調整)。