我正在尝试创建某种错误捕获方法,该方法将返回错误行号。我们有一封中止电子邮件,当进程中止时发送给我们err.number和err.description,但我想知道实际错误在哪里。
我知道您可以执行以下操作:
1: code here
2: code here
3: code here
等等,并使用 ERL 来获取数字,但是这样输入每一行会很乏味。
有没有一种方法可以自动执行此操作,或者使用 Stacktrace 会更容易吗?如果 Stacktrace 更好,你能给我举个例子吗?
我正在尝试创建某种错误捕获方法,该方法将返回错误行号。我们有一封中止电子邮件,当进程中止时发送给我们err.number和err.description,但我想知道实际错误在哪里。
我知道您可以执行以下操作:
1: code here
2: code here
3: code here
等等,并使用 ERL 来获取数字,但是这样输入每一行会很乏味。
有没有一种方法可以自动执行此操作,或者使用 Stacktrace 会更容易吗?如果 Stacktrace 更好,你能给我举个例子吗?
我从其他论坛改编了一个例子,在我的例子中,我没有得到导致错误的行号,所以我开始玩弄并找到了解决方案,代码如下:
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 中,我得到了导致问题的行号。
在异常堆栈跟踪中生成行号是 CLR 的内置功能。但是,您必须提供将代码地址映射到行号所需的信息。切换到项目的发布配置。项目+属性,编译选项卡,高级编译选项。将“生成调试信息”设置从 pdb-only 更改为 Full。将 .pdb 文件与您的程序一起部署。
请注意,您获得的行号始终是估计值,因此不要盲目相信您所看到的。由于抖动优化器内联方法以及移动代码以使程序运行得更快,映射是不完美的。
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
您绝对应该使用堆栈跟踪,因为您可以使用只需要编写一次代码的全局异常捕获机制。
要获得引发错误的确切行,您需要将 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
如果您希望继续使用 On Error Goto,只需将代码复制并粘贴到 UltraEdit 等程序员编辑器中,然后在单列编辑操作中插入所有行号。确保突出显示第一列,然后使用列/插入编号...
然后将其复制并粘贴回您的程序中。瞧,除了选择案例语句之后的第一个案例。在每个选择案例之后从第一个案例条目中删除您插入的行号。
您可以使用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