In dotNet löst eine Zeile eine Ausnahme aus und wird abgefangen, wie kann ich herausfinden, welche Zeile in welcher Datei die Ausnahme ausgelöst hat? Scheint relativ einfach, aber ich kann es nicht herausfinden ...Ermitteln, welche Codezeile die Ausnahme ausgelöst hat
Antwort
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.
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;
}
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
Diese Antwort ist falsch, aus den Gründen, die jerryjvl angegeben hat. Wie kann dies als richtig akzeptiert werden? – Timwi
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.
Ist Frame 0 nicht die aktuelle Frame-Methode, nicht wo der Fehler entstanden ist? –
Persönlich protokolliere ich nur den Rückgabewert ToString() der Ausnahme. Die gesamte Stack-Trace ist enthalten. Es ist eine Codezeile ... tot einfach.
Dies ist die richtige Antwort. – Timwi