2009-03-27 16 views
17

エラーが発生した行番号をどのように表示し、.NETがその.exesをコンパイルする方法でもこれが可能ですか?例外処理で行番号を表示する

もしそうでない場合は、Exception.Messageが自動的に削除されたサブを表示する方法がありますか?

try 
{ 
    int x = textbox1.Text; 
} 
catch(Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 
+0

このコードはどのようにコンパイルされますか? –

+5

それは私がちょうど例として示すためにそれを作っていない – Crash893

+0

可能な複製http://stackoverflow.com/questions/8338495/how-to-get-error-line-number-of-code-using-try-catch –

答えて

44

完全なスタックトレースを取得するには、ex.ToString()を使用します。

リリースモードであってもデバッグシンボル(.pdbファイル)を使用してコンパイルして、行番号を取得する必要があります(これはプロジェクトビルドプロパティのオプションです)。

+3

+1のPDBファイルと行番号 –

+1

Webプロジェクトで、サーバーにpdbsを配備する場合は、[Package/Publish Web]セクションのプロジェクトオプションで、[生成されたデバッグシンボルを除外]をオフにします。 –

+0

誰かが「デバッグシンボルを使ってコンパイル」についての説明を提供することはできますか? 私のプロジェクトには「DEBUG定数の定義」、「TRACE定数の定義」、「デバッグ情報:完全」という行番号がありません。 MSDNでは、プロパティページの左ペインの[ビルド]タブをクリックし、有効にするコンパイラ設定のチェックボックスをオンにします。無効にする設定のチェックボックスをオフにします。 便利です。 – omJohn8372

4

'StackTrace'を使用し、作業ディレクトリに.pdbファイルを含める場合は、スタックトレースに行番号を含める必要があります。

25

あなたはより詳細な情報が必要な場合は、System.Diagnostics.StackTraceクラス(ここではあなたがしようとするためのいくつかのコードがある)を使用することができますe.StackTrace

を使用し、与えられた例外のスタックトレースを表示するには:

try 
{ 
    throw new Exception(); 
} 
catch (Exception ex) 
{ 
    //Get a StackTrace object for the exception 
    StackTrace st = new StackTrace(ex, true); 

    //Get the first stack frame 
    StackFrame frame = st.GetFrame(0); 

    //Get the file name 
    string fileName = frame.GetFileName(); 

    //Get the method name 
    string methodName = frame.GetMethod().Name; 

    //Get the line number from the stack frame 
    int line = frame.GetFileLineNumber(); 

    //Get the column number 
    int col = frame.GetFileColumnNumber(); 
} 

をこれは、アセンブリに使用可能なpdbファイルがある場合にのみ機能します。プロジェクトプロパティ - ビルドタブ - 詳細 - デバッグ情報の選択を参照して、pdbファイルがあることを確認してください。

+0

なぜ最初のスタックフレームを取得しますか?あなたはむしろ最後のスタックフレームに興味を持っていませんか?つまり StackFrame frame = st.GetFrame(st.FrameCount - 1) –

+0

これをWCF Webサービスで使用しようとしましたが、返される行番号は常に0です。これは.pdbファイルが存在するデバッグモードです。 –

1
string lineNumber=e.StackTrace.Substring(e.StackTrace.Length - 7, 7);