2012-11-19 6 views
7

Ich versuche, eine Art Fehlerfangmethode zu erstellen, die die Fehlerzeilennummer zurückgibt. Wir haben eine Abbruch-E-Mail, die gesendet wird, wenn ein Prozess abbricht, gibt uns die Fehlernummer und Fehlerbeschreibung aber ich würde gerne wissen, wo ist eigentlich Fehler aus.So verwenden Sie Stacktrace, um Fehlerzeilennummer in vb.net zurückzugeben

Ich weiß, dass Sie Folgendes tun können:

1: code here 
2: code here 
3: code here 

usw. und verwenden ERL die Nummer zu bekommen, aber es wäre mühsam jede Zeile aus, so zu geben.

Gibt es eine Möglichkeit, dies automatisch zu tun, oder wäre es einfacher, StackTrace zu verwenden? Wenn StackTrace besser ist, könnten Sie mir bitte ein Beispiel zeigen?

+1

ERL ist die alte Art und Weise der Dinge von VB6 zu tun. Gibt es einen Grund, TRY/Catch nicht zu verwenden? Das Exception-Objekt hat einen schönen Stack-Trace und enthält die Zeilennummer. – PatFromCanada

Antwort

7

Das Generieren von Zeilennummern in Ausnahme-Stack-Traces ist eine integrierte Funktion für die CLR. Sie müssen jedoch die Informationen bereitstellen, die für die Zuordnung einer Codeadresse zu einer Zeilennummer erforderlich sind. Wechseln Sie in die Release-Konfiguration Ihres Projekts. Projekt + Eigenschaften, Registerkarte Kompilieren, Erweiterte Kompilierungsoptionen. Ändern Sie die Einstellung "Debug-Informationen generieren" von pdb-only in Full. Stellen Sie die PDB-Dateien zusammen mit Ihrem Programm bereit.

Beachten Sie, dass die Zeilennummer, die Sie erhalten, immer eine Schätzung ist, also vertrauen Sie nicht blindlings dem, was Sie sehen. Das Mapping ist aufgrund der Jitter-Optimizer-Inlining-Methoden unvollständig und bewegt den Code anderweitig, um das Programm schneller laufen zu lassen.

0

Sie sollten auf jeden Fall die Stack-Trace verwenden, da Sie einen globalen Ausnahmeerkennungsmechanismus verwenden können, den Sie nur einmal codieren müssen.

Um die genaue Zeile zu erhalten, in der der Fehler ausgelöst wurde, müssen Sie die pdb-Dateien mit Ihrer Anwendung versenden. Diese PDB-Dateien enthalten Debuginformationen einschließlich der Zeilennummer des Fehlers.

Wenn Sie wissen möchten, wie Sie nicht behandelte Ausnahmen elegant abfangen können, werfen Sie einen Blick auf this codeproject article.

12

Ich habe ein Beispiel aus anderen Foren, in meinem Fall angepasst, ich die Zeilennummer bekommen, wo der Fehler war nicht verursacht wurde, so begann ich um zu spielen und eine Lösung gefunden, wird der Code wie folgt:

Public Class Form1 
    Private Sub a2() 
     Dim b As Integer = 0 
     Dim a As Integer = 1/b 
    End Sub 

    Private Sub Button1_Click(ByVal sender As System.Object, _ 
ByVal e As System.EventArgs) Handles Button1.Click 
     Try 
      a2() 
     Catch ex As Exception 
      Dim st As New StackTrace(True) 
      st = New StackTrace(ex, True) 
      MessageBox.Show("Line: " & st.GetFrame(0).GetFileLineNumber().ToString, "Error") 
     End Try 
    End Sub 
End Class 

In diesem Beispiel löst Zeile 4 die Fehlerausnahme aus, aber sobald ich das Prinzip in einer realen Anwendung anwendete, war die Zeile 0, also begann ich mit dem Index in der GetFrame-Eigenschaft zu spielen, sie reicht von 0 bis 4 Als ich 4 in das Objekt EUREKA setzte, bekam ich die Zeilennummer, die das Problem verursachte.

+1

Ich versuchte dies in der aktuellen ASP.NET-Anwendung und es funktionierte mit einem Index auf 1 ... Meine Up-Mark hinzugefügt :-) – gchq

+0

Diese SO-Antwort zeigt, wie es richtig geht: http://StackOverflow.com/a/22338763/737393 – CrazyTim

+1

@gchq Vergessen Sie nicht, dem Konstruktor den booleschen Parameter hinzuzufügen. Für mich hat es nicht geklappt, wenn ich einen parameterlosen Konstruktor von StackTrace in VB hatte.net VS13 Express –

-1

Sie können die StackTrace verwenden, um die Zeilennummer bei einem Fehler abzurufen.

Try 
    'Put your code here 

Catch ex As Exception 
    Dim trace = New Diagnostics.StackTrace(ex, True) 
    Dim line As String = Right(trace.ToString, 5) 
    MessageBox.Show("'" & ex.Message & "'" & " Error in- Line number: " & line) 

End Try 
+0

fügen Sie eine Beschreibung hinzu und formatieren Sie Ihren Code – SeeuD1

0
Try 
     Dim x As Integer 
     x = " " 

    Catch ex As Exception 
     Dim trace = New Diagnostics.StackTrace(ex, True) 
     Dim line As String = Strings.Right(trace.ToString, 5) 
     Dim nombreMetodo As String = "" 

     For Each sf As StackFrame In trace.GetFrames 
      nombreMetodo = sf.GetMethod().Name & vbCrLf 
     Next 

     MessageBox.Show("Error en Linea number: " & line & vbCrLf & ex.Message & vbCrLf & "Metodos : " & nombreMetodo) 
    End Try 
+0

Bitte versuchen Sie zu vermeiden, nur Code als Antwort zu verlieren und versuchen Sie zu erklären, was es macht und warum. Ihr Code ist möglicherweise nicht offensichtlich für Personen, die nicht über die entsprechende Codiererfahrung verfügen. Bitte bearbeiten Sie Ihre Antwort, um [Klärung, Kontext und versuchen Sie, Einschränkungen, Annahmen oder Vereinfachungen in Ihrer Antwort zu erwähnen.] (Https://stackoverflow.com/help/how-to-answer) –

0
Try 
     Dim x As Integer 
     x = " " 

    Catch ex As Exception 
     Dim trace = New Diagnostics.StackTrace(ex, True) 
     Dim line As String = Strings.Right(trace.ToString, 5) 
     Dim nombreMetodo As String = "" 
     Dim Xcont As Integer = 0 

     For Each sf As StackFrame In trace.GetFrames 
      Xcont = Xcont + 1 
      nombreMetodo = nombreMetodo & Xcont & "- " & sf.GetMethod().ReflectedType.ToString & " " & sf.GetMethod().Name & vbCrLf 
     Next 

     MessageBox.Show("Error en Linea number: " & line & ex.Message & vbCrLf & "Metodos : " & vbCrLf & nombreMetodo) 

    End Try 
Verwandte Themen