2010-04-27 8 views
11

Mögliche Duplizieren:
Show line number in exception handlingAusnahmebehandlung - Zeilennummer anzeigen, an der der Fehler aufgetreten ist?

Kann mir bitte jemand sagen, wie die Zeilennummer des Codes zu erhalten, wo der Fehler aufgetreten ist und zeigt es auf der Konsole?

Andere Informationen wie der Dateiname oder der Methodenname wären sehr praktisch.

+0

duplizieren http://stackoverflow.com/questions/8338495/how-to-get-error-line-number-of-code -using-try-catch –

Antwort

10

Sie können den gesamten Stack-Trace drucken, indem Sie einen try/catch um den Code, der dann werfen kann und Console.WriteLine mit dem Ausnahme-Objekt zeigen:

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

Ausgang:

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 

Des In der ersten Zeile wird der Typ der Ausnahme und die Nachricht angezeigt. Die zweite Zeile zeigt die Datei, Funktion und Zeilennummer an, an der die Ausnahme ausgelöst wurde. In den folgenden Zeilen können Sie auch die Positionen anderer Anrufe in der Anrufliste sehen.

Sie können auch Datei- und Zeilennummern für nicht abgefangene Ausnahmen abrufen. Sie können dies tun, indem Sie einen Handler für das AppDomain.UncaughtException Ereignis auf dem aktuellen AppDomain Zugabe:

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); 
} 

Dies zeigt eine ähnliche Ausgabe oben.

+0

Dies funktioniert nicht mit der MessageBox-Klasse. –

2

Sie können den Stack-Trace abrufen, indem Sie auf Exception.StackTrace zugreifen. Dies ist eine Zeichenfolge, sodass Sie sie mit den Methoden Write oder WriteLine auf der Konsole drucken können.

5
Console.WriteLine(exception.StackTrace); 

Stellen Sie sicher, Ihre Anwendung in Debug Modus ist oder sind die Debug-Symbole (die MDB-Datei), um Zahlen für Zeile erscheinen.

+5

Eigentlich benötigen Sie die * Debug-Symbole * (die MDB-Datei), damit die Zeilennummern angezeigt werden. Die Build-Konfiguration hat nichts damit zu tun. –

+2

+1 zum Aufzeigen des Debug-Modus. – JasCav

+2

Debug-Modus ist irrelevant. –

0

Sie finden es in der Stack-Ablaufverfolgung (Exception.StackTrace property) in der letzten Zeile, aber nur, wenn Ihr Code mit Debugging-Informationen kompiliert wurde. Ansonsten ist die Zeilennummer unbekannt.

14

Wenn Sie die Datei- und Zeilennummern möchten, müssen Sie die StackTrace-Zeichenfolge nicht analysieren. Sie können System.Diagnostics.StackTrace verwenden, um eine Stack-Ablaufverfolgung aus einer Ausnahme zu erstellen, mit der Sie die Stack-Frames auflisten und den Dateinamen, die Zeilennummer und die Spalte abrufen können, für die die Ausnahme ausgelöst wurde. Hier ist ein schnelles und schmutziges Beispiel, wie man das macht. Keine Fehlerprüfung enthalten. Damit dies funktioniert, muss eine PDB mit den Debug-Symbolen vorhanden sein, diese wird standardmäßig mit debug build erstellt.

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(); 
    } 
    } 
} 

Die Ausgabe aus dem obigen Code sieht wie folgt aus

 
D:\Source\NGTests\ConsoleApplication1\Program.cs:TestFunction(30,7) 
D:\Source\NGTests\ConsoleApplication1\Program.cs:Main(11,9) 
+0

Dies ist ein großartiges Beispiel. Hat frames [0] immer die Methode, die Zeilennummer, die Spaltennummer und den Dateinamen? Statt alle 20 Frames oder die gesamte Anzahl zu durchlaufen, können wir einfach die Werte wie string lineNumber = frames [0] .GetFileLineNumber() – JoshYates1980

+1

@ JoshYates1980 direkt zuweisen, der Dateiname, die Zeile und die Spalte sind nur verfügbar, wenn Sie debuggen Infos enthalten. Sie können auf den Frame per Index zugreifen, natürlich sollten Sie prüfen, ob der Index, auf den Sie zugreifen möchten, existiert, andernfalls erhalten Sie eine IndexOutOfRangeException. –