11

重複の可能性:
例外処理で行番号を表示する

エラーが発生したコードの行番号を取得してコンソールに表示する方法を教えてください。

ファイル名やメソッド名などのその他の情報は非常に便利です。

4

5 に答える 5

14

ファイル番号と行番号が必要な場合は、StackTrace 文字列を解析する必要はありません。System.Diagnostics.StackTrace を使用して、例外からスタック トレースを作成できます。これにより、スタック フレームを列挙し、例外が発生したファイル名、行番号、および列を取得できます。これを行う方法の簡単で汚い例を次に示します。エラーチェックは含まれていません。これが機能するには、PDB がデバッグ シンボルと共に存在する必要があります。これはデフォルトでデバッグ ビルドで作成されます。

using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
  class Program
  {    
    static void Main(string[] args)
    {      
      try
      {
        TestFunction();
      }
      catch (Exception ex)
      {
        StackTrace st = new StackTrace(ex, true);
        StackFrame[] frames = st.GetFrames();

        // Iterate over the frames extracting the information you need
        foreach (StackFrame frame in frames)
        {
          Console.WriteLine("{0}:{1}({2},{3})", frame.GetFileName(), frame.GetMethod().Name, frame.GetFileLineNumber(), frame.GetFileColumnNumber());
        }
      }

      Console.ReadKey();
    }

    static void TestFunction()
    {      
      throw new InvalidOperationException();
    }
  }
}

上記のコードからの出力は次のようになります

D:\Source\NGTests\ConsoleApplication1\Program.cs:TestFunction(30,7)
D:\Source\NGTests\ConsoleApplication1\Program.cs:Main(11,9)
于 2010-04-27T18:11:34.207 に答える
10

スローできるコードの周りにtry/catchを使用し、Console.WriteLineを使用して例外オブジェクトを表示することにより、スタックトレース全体を出力できます。

try
{
    new Program().Run();
}
catch (Exception exception)   // Prefer to catch a more specific execption.
{
    Console.WriteLine(exception);
}

出力:

System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at Program.Run() in C:\Console Application1\Program.cs:line 37
   at Program.Main(String[] args) in C:\Console Application1\Program.cs:line 45

最初の行は、例外のタイプとメッセージを示しています。2行目は、例外がスローされたファイル、関数、および行番号を示しています。次の行で、コールスタック上の他の呼び出しの場所も確認できます。

キャッチされなかった例外のファイル番号と行番号を取得することもできます。これを行うには、現在のAppDomainでAppDomain.UncaughtExceptionイベントのハンドラーを追加します。

static void Main(string[] args)
{
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    new Program().Run();
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Console.WriteLine(e.ExceptionObject);
}

これは、上記と同様の出力を示しています。

于 2010-04-27T17:50:31.097 に答える
5
Console.WriteLine(exception.StackTrace);

Debug行番号を表示するには、アプリケーションがモードになっていること、またはデバッグシンボル(.mdbファイル)が含まれていることを確認してください。

于 2010-04-27T17:51:58.167 に答える
2

文字列であるにアクセスすることでスタックトレースを取得できるため、またはメソッドException.StackTraceを使用してコンソールに出力できます。WriteWriteLine

于 2010-04-27T17:51:09.403 に答える
0

これは、最後の行のスタックトレース(Exception.StackTrace property)にありますが、コードがデバッグ情報を含めてコンパイルされている場合に限ります。そうしないと、行番号が不明になります。

于 2010-04-27T17:54:18.287 に答える