2009-05-23 14 views
1

Gibt es in VB.NET die Möglichkeit, die aktuelle Zeilennummer im Quellcode auszugeben? Zum Beispiel:Ausgabe von Zeilennummern

Try 
    ' The following line will purposly cause an error 
    Dim BigNum As Int64 
    Dim LittleNum As Int16 = CShort(BigNum) 
Catch ex As Exception 
    Dim LineNumber As Integer = <linenumber> ' How do I do this? 
    MessageBox.Show("Error in source code. Line: " + LineNumber) 
End Try 

Gibt es eine Möglichkeit, die Linenumber Variable in dem obigen Beispiel mit der aktuellen Zeilennummer im Quellcode zu füllen, die den Fehler verursacht hat?

Antwort

0

Die Zeilennummer befindet sich bereits im Stack-Trace der Exception. Ich denke es zeigt sich sogar in einem einfachen ex.ToString.

5

Dies sollte die Arbeit machen:

Dim stackTrace = New System.Diagnostics.StackTrace(ex) 
Dim stackFrame = stackTrace.GetFrame(stackTrace.FrameCount - 1) 
Dim lineNumber = stackFrame.GetFileLineNumber() 

Beachten Sie, dass GetFrame(stackTrace.FrameCount - 1)) die erste Rahmen wird auf den Stapel geschoben. In diesem Fall ist dies der Rahmen, der den aktuellen try-catch-Block enthält, was Sie wollen. Sehen Sie sich die MSDN docs für weitere Informationen)

+0

Vielen Dank. Das sieht genau so aus, wie ich es gesucht habe! –

+0

Froh, zu helfen. Wenn Sie keine weiteren Fragen haben, können Sie diese als Antwort akzeptieren? – Noldorin

+0

Ich habe es ausprobiert, aber der StackFrame enthält keine Informationen (GetFileName gibt Nothing zurück und GetFileLineNumber gibt 0 zurück). Habe ich etwas verpasst? –

0

Ich wollte nur Noldorin Antwort korrigieren, weil sie/er den falschen Stacktrace Konstruktor verwendet.

Dim stackTrace = New System.Diagnostics.StackTrace(ex, True) 
Dim stackFrame = stackTrace.GetFrame(stackTrace.FrameCount - 1) 
Dim lineNumber = stackFrame.GetFileLineNumber() 

Angabe True als das zweite Argument für den Konstruktor sagt es, den Stapel zu erfassen Quellinformationen zum Zeitpunkt der Erstellung. Ohne sie wird stackFrame.GetFileLineNumber() immer wieder zurückkehren 0.

Siehe http://msdn.microsoft.com/en-us/library/dsay49kt.aspx für eine Erklärung des richtigen Konstruktor und http://msdn.microsoft.com/en-us/library/25h0kw08.aspx den Konstruktor zu zeigen, dass Noldorin vorgeschlagen. Beachten Sie die Bemerkungen Abschnitt in dem es heißt:

Der Stacktrace mit dem Anrufer aktuellem Thread erstellt wird, und nicht nicht Dateinamen enthält, die Zeilennummer oder Spalteninformationen.

Die resultierende Stack-Trace beschreibt den Stack zum Zeitpunkt der Ausnahme.