Zur Laufzeit gibt es keinen Quellcode. Wofür wird diese Zeilennummer verwendet? Zum Zeitpunkt des Debuggens zeigt die IDE deutlich die Zeile an, die eine Ausnahme auslöst.
Wenn Sie die Zeilennummer nicht nur für den formatierten Stack-Trace benötigen, den Sie von Exception.StackTrace erhalten, können Sie die StackTrace- Klasse verwenden:
try{thrownewException();}catch(Exception ex){// Get stack trace for the exception with source file informationvar st =newStackTrace(ex,true);// Get the top stack framevar frame = st.GetFrame(0);// Get the line number from the stack framevar line = frame.GetFileLineNumber();}
Beachten Sie, dass dies nur funktioniert, wenn für die Assembly eine PDF-Datei verfügbar ist.
? (New StackTrace (ex, True)). GetFrame (0) .GetFileLineNumber () für eine einzelne VB-Zeile aus dem unmittelbaren Fenster.
Jonathan
34
C # one Liner:int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
Gunwin
17
Dies gibt für mich immer 0 zurück. Wird dies dadurch verursacht, dass keine PDF-Datei vorhanden ist? Was ist das und wie bekommt man es? (Ich benutze ASP.net)
Brabbeldas
17
Warum verwenden Sie GetFrame (0)? Ich würde denken, dass Sie GetFrame (FrameCount-1) verwenden sollten.
Dewald Swanepoel
9
Ich habe den Vorschlag von @DewaldSwanepoel gefunden GetFrame(st.FrameCount-1), weitaus zuverlässiger zu sein.
Brad Martin
75
Verwenden Sie auf einfache Weise die Exception.ToString()Funktion, um die Zeile nach der Ausnahmebeschreibung zurückzugeben.
Sie können auch die Programm-Debug-Datenbank überprüfen, da sie Debug-Informationen / Protokolle über die gesamte Anwendung enthält.
Nun, MSDN denkt anders, dass es "eine Zeichenfolgendarstellung der aktuellen Ausnahme erstellt und zurückgibt": msdn.microsoft.com/en-us/library/…
Prokurors
Sie erhalten etwas Ähnliches wie:System.Exception: Test at Tests.Controllers.HomeController.About() in c:\Users\MatthewB\Documents\Visual Studio 2013\Projects\Tests\Tests\Controllers\HomeController.cs:line 22
Professor für Programmierung
3
Dies sollte die akzeptierte Antwort sein. Ich habe mich immer für ex.message entschieden und mich gefragt, warum dummes VB.net nicht in der Lage ist, die gleichen Informationen wie in Java zu erhalten.
Matthis Kohli
3
Es ist verrückt, dass diese Antwort nicht mehr positive Stimmen hat. Dies ist einfach, funktioniert zuverlässig und ist nicht mit den PDB-Einschränkungen verbunden.
Funktioniert leider nicht in einem nicht englischen Betriebssystem ("Zeilen" -Wort hängt vom Gebietsschema ab).
Ivan Kochurkin
2
@KvanTTT Sie können Regex.Matchmit :[^ ]+ (\d+)für den gleichen Effekt verwenden.
Dan Bechard
Diese Antwort funktioniert bei mir nicht, da ex.StackTrace nein hat :line und ich die PDB-Datei nicht habe.
Kriegsähnlicher Schimpanse
18
Sie können .PDBder Assembly zugeordnete Symboldateien einschließen , die Metadateninformationen enthalten. Wenn eine Ausnahme ausgelöst wird, enthält sie vollständige Informationen in der Stapelverfolgung, aus der diese Ausnahme stammt. Es enthält die Zeilennummern jeder Methode im Stapel.
Was ist mit unbehandelten Ausnahmen? wie UnhandledExceptionEventArgsObjekt
Yousha Aleayoub
6
Überprüfen Sie dieses
StackTrace st =newStackTrace(ex,true);//Get the first stack frameStackFrame frame = st.GetFrame(0);//Get the file namestring fileName = frame.GetFileName();//Get the method namestring methodName = frame.GetMethod().Name;//Get the line number from the stack frameint line = frame.GetFileLineNumber();//Get the column numberint col = frame.GetFileColumnNumber();
// Get stack trace for the exception with source file informationvar st =newStackTrace(ex,true);// Get the top stack framevar frame = st.GetFrame(st.FrameCount-1);// Get the line number from the stack framevar line = frame.GetFileLineNumber();
Ich habe versucht, die Lösung By @ davy-c zu verwenden, hatte aber die Ausnahme "System.FormatException: 'Eingabezeichenfolge hatte nicht das richtige Format.'". Dies lag daran, dass nach der Zeilennummer immer noch Text vorhanden war. Ich habe den Code geändert gepostet und kam mit:
int line =Convert.ToInt32(objErr.ToString().Substring(objErr.ToString().IndexOf("line")).Substring(0, objErr.ToString().Substring(objErr.ToString().IndexOf("line")).ToString().IndexOf("\r\n")).Replace("line ",""));
staticclassExceptionHelpers{publicstaticintLineNumber(thisException ex){int n;int i = ex.StackTrace.LastIndexOf(" ");if(i >-1){string s = ex.StackTrace.Substring(i +1);if(int.TryParse(s,out n))return n;}return-1;}}
Verwendung
try{thrownewException("A new error happened");}catch(Exception ex){//If error in exception LineNumber() will be -1System.Diagnostics.Debug.WriteLine("["+ ex.LineNumber()+"] "+ ex.Message);}
var st =newStackTrace(e,true);// Get the bottom stack framevar frame = st.GetFrame(st.FrameCount-1);// Get the line number from the stack framevar line = frame.GetFileLineNumber();var method = frame.GetMethod().ReflectedType.FullName;var path = frame.GetFileName();
In der Datei Global.resx gibt es ein Ereignis namens Application_Error
Es wird ausgelöst, wenn ein Fehler auftritt. Sie können problemlos Informationen zu dem Fehler abrufen und diese an eine E-Mail zur Fehlerverfolgung senden.
Ich denke auch, alles was Sie tun müssen, ist die Datei global.resx zu kompilieren und ihre DLLs (2 DLLs) zu Ihrem Bin-Ordner hinzuzufügen, und es wird funktionieren!
Antworten:
Wenn Sie die Zeilennummer nicht nur für den formatierten Stack-Trace benötigen, den Sie von Exception.StackTrace erhalten, können Sie die StackTrace- Klasse verwenden:
Beachten Sie, dass dies nur funktioniert, wenn für die Assembly eine PDF-Datei verfügbar ist.
quelle
int line = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
GetFrame(st.FrameCount-1)
, weitaus zuverlässiger zu sein.Verwenden Sie auf einfache Weise die
Exception.ToString()
Funktion, um die Zeile nach der Ausnahmebeschreibung zurückzugeben.Sie können auch die Programm-Debug-Datenbank überprüfen, da sie Debug-Informationen / Protokolle über die gesamte Anwendung enthält.
quelle
System.Exception: Test at Tests.Controllers.HomeController.About() in c:\Users\MatthewB\Documents\Visual Studio 2013\Projects\Tests\Tests\Controllers\HomeController.cs:line 22
Exception.Message
ist tot für mich. Nie wieder.Wenn Sie die
.PBO
Datei nicht haben :C #
Vb.net
Oder als Erweiterung der Exception-Klasse
quelle
Regex.Match
mit:[^ ]+ (\d+)
für den gleichen Effekt verwenden.:line
und ich die PDB-Datei nicht habe.Sie können
.PDB
der Assembly zugeordnete Symboldateien einschließen , die Metadateninformationen enthalten. Wenn eine Ausnahme ausgelöst wird, enthält sie vollständige Informationen in der Stapelverfolgung, aus der diese Ausnahme stammt. Es enthält die Zeilennummern jeder Methode im Stapel.quelle
Es klappt:
quelle
UnhandledExceptionEventArgs
ObjektÜberprüfen Sie dieses
quelle
Update auf die Antwort
quelle
Ich habe versucht, die Lösung By @ davy-c zu verwenden, hatte aber die Ausnahme "System.FormatException: 'Eingabezeichenfolge hatte nicht das richtige Format.'". Dies lag daran, dass nach der Zeilennummer immer noch Text vorhanden war. Ich habe den Code geändert gepostet und kam mit:
Dies funktioniert bei mir in VS2017 C #.
quelle
Erweiterungsmethode
Verwendung
quelle
Arbeiten für mich:
quelle
Ich habe der Ausnahme eine Erweiterung hinzugefügt, die die Zeile, Spalte, Methode, den Dateinamen und die Nachricht zurückgibt:
quelle
In der Datei Global.resx gibt es ein Ereignis namens Application_Error
Es wird ausgelöst, wenn ein Fehler auftritt. Sie können problemlos Informationen zu dem Fehler abrufen und diese an eine E-Mail zur Fehlerverfolgung senden.
Ich denke auch, alles was Sie tun müssen, ist die Datei global.resx zu kompilieren und ihre DLLs (2 DLLs) zu Ihrem Bin-Ordner hinzuzufügen, und es wird funktionieren!
quelle