Как использовать Stacktrace для возврата номера строки ошибки в vb.net
Я пытаюсь создать какой-то метод ловли ошибок, который вернет номер строки ошибки. У нас есть сообщение об отмене, которое отправляется, когда процесс прерывается, что дает нам err.номер и err.описание но я хотел бы знать, где на самом деле ошибки.
Я знаю, вы можете сделать следующее:
1: code here
2: code here
3: code here
etc. и используйте ERL, чтобы получить номер, но было бы утомительно вводить каждую строку таким образом.
Is есть ли способ автоматически сделать это, или было бы проще использовать Stacktrace? Если Stacktrace лучше, не могли бы вы показать мне пример?
6 ответов
генерация номеров строк в трассировках стека исключений является встроенной функцией для среды CLR. Однако вы должны предоставить информацию, необходимую для сопоставления адреса кода с номером строки. Переключитесь на конфигурацию выпуска вашего проекта. Проект + свойства, вкладка компиляция, расширенные параметры компиляции. Измените параметр "создать отладочную информацию" с pdb-only на Full. Разверните .pdb файлы вместе с вашей программой.
остерегайтесь, что номер строки вам всегда оценить так не доверяйте слепо тому, что видите. Отображение несовершенно из-за методов ввода оптимизатора дрожания и в противном случае перемещения кода, чтобы программа работала быстрее.
я адаптировал пример с другого форума, в моем случае я не получал номер строки, где была вызвана ошибка, поэтому я начал играть и нашел решение, код выглядит следующим образом:
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
в этом примере строка 4 вызовет исключение ошибки, но как только я применил принцип в реальном приложении, строка была 0, поэтому я начал играть с индексом в свойстве GetFrame, он колеблется от 0 до 4, Когда я положил 4 в объект, EUREKA, я получил строку номер, вызывающий проблему.
вы обязательно должны использовать трассировку стека, так как вы можете использовать глобальный механизм улавливания исключений, который вам нужно будет кодировать только один раз.
чтобы получить точную строку, на которой была вызвана ошибка, вам нужно будет отправить файлы pdb с вашим приложением. Эти файлы pdb содержат отладочную информацию, включая номер строки ошибки.
Если вы хотите знать, как правильно ловить необработанные исключения, посмотри этот codeproject статья.
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
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
можно использовать StackTrace чтобы получить номер строки при ошибке.
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