2012-03-30 4 views

答えて

5

Tclによってスローされたあらゆる種類のエラーをトラップするcoreコマンドはcatchです。少なくとも1つの引数、評価するスクリプトを取り、そのスクリプトを評価する結果コードを返します。結果コードは、エラーが発生した場合は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 Interpreter Error:" on1 "を読むことができません:ターミナルにはそのような変数はありませんが、関数にはありません。 – ilya1725