我试图建立某种形式的错误捕获方法将返回错误行号。 我们有一个发送出去当一个进程中止,让我们的Err.Number和err.description,但我想知道这里居然是出现了错误中止电子邮件。
我知道你可以做到以下几点:
1: code here
2: code here
3: code here
等,并使用ERL拿到的数目,但它会乏味键入每行出这样的。
有两种办法来自动执行此操作,或使用堆栈跟踪将是更容易? 如果堆栈跟踪是更好的可以请你告诉我一个例子?
我试图建立某种形式的错误捕获方法将返回错误行号。 我们有一个发送出去当一个进程中止,让我们的Err.Number和err.description,但我想知道这里居然是出现了错误中止电子邮件。
我知道你可以做到以下几点:
1: code here
2: code here
3: code here
等,并使用ERL拿到的数目,但它会乏味键入每行出这样的。
有两种办法来自动执行此操作,或使用堆栈跟踪将是更容易? 如果堆栈跟踪是更好的可以请你告诉我一个例子?
在异常堆栈跟踪生成行号是一个内置功能的CLR。 然而,你必须提供它需要一个代码地址映射到行号的信息。 切换到项目的Release配置。 项目+属性,编译选项卡,高级编译选项。 更改“生成调试信息”从PDB-才完全设置。 部署.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
您可以使用堆栈跟踪检索有关错误的行号。
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