dotNetでは、行が例外をスローしてキャッチされますが、どのファイルのどの行が例外をスローしたかをどのように把握できますか?比較的簡単に思えますが、理解できません...
4 に答える
デバッグシンボルが利用可能な場合にのみ実行できます。
catch(Exception ex) {
// check the ex.StackTrace property
}
VSでこのような状況をデバッグする場合は、メニューにあるダイアログのチェックThrown
ボックスをオンにすることをお勧めします。デバッガーは、ブロック内であっても、例外がスローされるとすぐに中断します。Common Language Runtime Exceptions
Exceptions
Debug
try
個人的には、例外のToString()の戻り値をログに記録するだけです。スタックトレース全体が含まれます。これは1行のコードです...非常に単純です。
StackFrameクラスを使用できます:
try
{
...
...
}
catch(...)
{
StackFrame sf = new StackFrame(true);
int lineNumber = sf.GetFileLineNumber();
int colNumber = sf.GetFileColumnNumber();
string fileName = sf.GetFileName();
string methodName = sf.GetMethod().Name;
}
.NETには、FirstChanceExceptionと呼ばれるものがあります。これらは基本的に、例外が処理される前にスローされます。ここで提示している問題を確認するには、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);
...
}
ここでの唯一の違いは、スタックトレース全体を取得してから、最初に例外がスローされた最初のフレームに移動することです。