2009-06-29 9 views

Antwort

6

Sie können es nur tun, wenn Sie Debug-Symbole verfügbar haben.

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

Wenn Sie eine solche Situation in VS debuggen wollen, sollten Sie besser überprüfen nur Thrown Checkbox für Common Language Runtime Exceptions in Exceptions Dialog in Debug Menü. Der Debugger bricht ab, sobald die Ausnahme ausgelöst wird, selbst wenn er sich in einem try Block befindet.

+0

Dies ist die richtige Antwort. – Timwi

1

könnten Sie verwenden die StackFrame Class:

try 
{ 
    ... 
    ... 

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

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

Beachten Sie jedoch, dass dies die Informationen für die 'catch' Klausel zurückgibt ... nicht wo die Ausnahme ausgelöst wurde, dafür müssen Sie den Inhalt der Eigenschaft 'StackTrace' der Ausnahme überprüfen, die Sie gefangen haben! – jerryjvl

+0

Diese Antwort ist falsch, aus den Gründen, die jerryjvl angegeben hat. Wie kann dies als richtig akzeptiert werden? – Timwi

1

Nun, in .NET Sie haben whats FirstChanceException genannt. Diese werden im Wesentlichen ausgelöst, bevor eine Ausnahme behandelt wird. Es gibt zwei Möglichkeiten, das Thema zu betrachten, das Sie hier präsentieren. Einer ist von einem Debugging-Winkel. Wenn Sie debuggen, können Sie Ihren Debugger so einstellen, dass er ausgelöste Ausnahmen vom Debug/Exceptions-Fenster abfängt. Dies ist in einem interaktiven Kontext einfacher. Wenn Sie diese Informationen aufzeichnen müssen aus einem nicht-interaktiven Kontext dann würde ich etwas ähnliches tun, was CMS redet ...

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

Der einzige Unterschied ist, dass wir das gesamte Stack-Trace zu erhalten, dann Gehe zum ersten Bild, wo die Ausnahme ursprünglich geworfen wurde.

+0

Ist Frame 0 nicht die aktuelle Frame-Methode, nicht wo der Fehler entstanden ist? –

2

Persönlich protokolliere ich nur den Rückgabewert ToString() der Ausnahme. Die gesamte Stack-Trace ist enthalten. Es ist eine Codezeile ... tot einfach.