2012-03-30 66 views

回答

5

捕獲Tcl拋出的任何類型的錯誤的核心命令是catch。它至少需要一個參數,一個腳本來評估,並返回評估該腳本的結果代碼。發生錯誤時的結果代碼爲1,沒有錯誤時的0,以及其他情況下的一堆其他情況(指示其他類型的通常非錯誤異常)。 catch還採用一個可選參數,該參數用於命名將變量寫入其中以評估腳本錯誤消息的結果。全局變量errorInfo將在出現錯誤時包含堆棧跟蹤(或者從8.5開始,您可以通過傳入catch的進一步變量名稱獲取解釋器狀態字典)。

要捕獲一些腳本「foo.tcl」的錯誤,你可以使用這樣的代碼:

if {[catch {source foo.tcl} msg]} { 
    puts "I got an error: $msg" 
    puts "The stack trace was this:\n$errorInfo" 
} 

這是給你的工作如何,如果你想編寫出一個文件。 (我使用這種技術的外部腳本實現了一個經過仔細測試的錯誤陷阱,並加載了一個內部腳本來完成真正的工作,我發現它運行良好,或者您可以通過「抓住」腳本調用過程。 ; Tcl的應該所有錯誤捕獲的,並有其漏網之魚極少數情況)


另一條路線的錯誤可以被報告是通過bgerror,這被稱爲處理事件過程中所發生的錯誤。處理。這是一個你可以編寫自己版本的程序;它會給出一個單一的參數時,稱那是錯誤信息,將有全球errorInfo設置正確調用時:

proc bgerror {msg} { 
    global errorInfo 
    puts "I got an error in an event: $msg" 
    puts "The stack trace was this:\n$errorInfo" 
} 

如果沒有定義的bgerror執行,堆棧跟蹤剛寫入stderr頻道。如果您使用的是Tk軟件包,則會提供一個bgerror的實現,它會彈出一個描述問題的對話框。

1

嘗試使用bgerror或interp bgerror命令。

閱讀bgerror文檔,它有一個簡單的例子。

+0

好的建議。但它不起作用。 :(我仍然得到'Tcl解釋器錯誤:無法讀取「on1」:終端上沒有這樣的變量,但在函數中沒有。 – ilya1725 2012-03-30 23:27:53