2009-06-29 4 views
6

dotNetで例外がスローされ、キャッチされた場合、どのファイルのどの行が例外をスローしたかをどのように把握できますか?比較的単純ですが、私はそれを理解することはできません...例外をスローしたコード行の特定

答えて

6

利用できるデバッグシンボルがある場合のみ行うことができます。

catch(Exception ex) { 
    // check the ex.StackTrace property 
} 

あなたはVSでこのような状況をデバッグしたい場合は、より良いだけでExceptionsDebugメニューにあるダイアログCommon Language Runtime ExceptionsためThrownチェックボックスをチェックしたいです。デバッガは、ブロックがtryのブロックであっても、例外がスローされるとすぐに中断します。 FirstChanceExceptionと呼ばれるいただきました!あなたが持っている.NETで、

try 
{ 
    ... 
    ... 

} 
catch(...) 
{ 
    StackFrame sf = new StackFrame(true); 

    int lineNumber = sf.GetFileLineNumber(); 
    int colNumber = sf.GetFileColumnNumber(); 
    string fileName = sf.GetFileName(); 
    string methodName = sf.GetMethod().Name; 
} 
+0

これは正解です。 – Timwi

1

あなたがStackFrame Classを使用することができます。これらは基本的に例外が処理される前にスローされます。あなたがここで提示している問題を見る方法は2つあります。 1つはデバッグ角度からのものです。デバッグの場合は、デバッグ/例外ウィンドウからスローされた例外をキャッチするようにデバッガを設定することができます。これは、対話的な文脈ではより簡単です。あなたは非対話コンテキスト内からこの情報を記録する必要がある場合、私はCMSが話しているものに似た何かをするだろう...

try 
{ 
    ... 
} 
catch(Exception ex) 
{ 
    System.Diagnostics.StackTrace stackTrace = new System.Diagnostics.StackTrace(ex); 
    System.Diagnostics.StackFrame firstFrame = stackTrace.GetFrame[0]; 
    Console.WriteLine(firstFrame.GetFileLineNumber); 
    ... 
} 

ここでの唯一の違いは、その後、我々は全体のスタックトレースを取得するということです例外が最初にスローされた最初のフレームに移動します。

+4

しかし、これは 'catch'句の情報を返します。例外がスローされた場所ではなく、捕捉した例外の 'StackTrace'プロパティの内容をチェックする必要があります。 – jerryjvl

+0

jerryjvlが述べている理由で、この答えは間違っています。どのようにこれを正しいものとして受け入れることができますか? – Timwi

1

まあ:

+0

フレーム0はフレームの現在のメソッドではなく、エラーの発生元ではありませんか? –

2

個人的には、私は例外のToString()戻り値を記録します。スタックトレース全体が含まれます。それはコードの1行です...死んだ単純です。

関連する問題