如何在 vb.net 中使用 Stacktrace 返回错误行号
Posted
技术标签:
【中文标题】如何在 vb.net 中使用 Stacktrace 返回错误行号【英文标题】:How to use Stacktrace to return Error Line Number in vb.net 【发布时间】:2012-11-07 18:42:33 【问题描述】:我正在尝试创建某种将返回错误行号的错误捕获方法。我们有一封中止电子邮件,当进程中止时发送给我们 err.number 和 err.description 但我想知道实际错误在哪里。
我知道你可以做到以下几点:
1: code here
2: code here
3: code here
等等。并使用 ERL 来获取数字,但这样输入每一行会很乏味。
有没有一种方法可以自动执行此操作,或者使用 Stacktrace 会更容易吗?如果 Stacktrace 更好,你能给我举个例子吗?
【问题讨论】:
ERL 是 VB6 中的旧方法。有理由不使用 TRY/Catch 吗?异常对象有一个很好的堆栈跟踪并包括行号。 【参考方案1】:如果您希望继续使用 On Error Goto,只需将代码复制并粘贴到 UltraEdit 等程序员编辑器中,然后在单列编辑操作中插入所有行号。确保突出显示第一列,然后使用列/插入编号...
然后将其复制并粘贴回您的程序中。瞧,除了选择案例语句之后的第一个案例。从每个选择案例之后的第一个案例条目中删除您插入的行号。
【讨论】:
【参考方案2】: 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
【讨论】:
这个对我有用,我刚刚从***.com/a/22338763/737393添加了一些未成年人的详细信息【参考方案3】: 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
【讨论】:
请尽量避免仅仅将代码作为答案,并尝试解释它的作用和原因。对于没有相关编码经验的人来说,您的代码可能并不明显。请编辑您的答案以包含clarification, context and try to mention any limitations, assumptions or simplifications in your answer.【参考方案4】:您可以使用 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
【讨论】:
【参考方案5】:我从其他论坛改编了一个例子,在我的例子中,我没有得到导致错误的行号,所以我开始玩弄并找到了解决方案,代码如下:
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 时,我得到了导致问题的行号。
【讨论】:
我在当前的 ASP.NET 应用程序中尝试了这个,它使用 1 上的索引...我的上标记添加 :-) 这个 SO 答案显示了如何正确地做到这一点:***.com/a/22338763/737393 @gchq 不要忘记将布尔参数添加到构造函数中。对我来说,在 VB.net VS13 Express 中使用 StackTrace 的无参数构造函数时它不起作用 你能详细说明吗?【参考方案6】:在异常堆栈跟踪中生成行号是 CLR 的内置功能。但是,您必须提供将代码地址映射到行号所需的信息。切换到项目的发布配置。项目+属性,编译选项卡,高级编译选项。将“生成调试信息”设置从 pdb-only 更改为 Full。将 .pdb 文件与您的程序一起部署。
请注意,您获得的行号始终是估计值,因此不要盲目相信您所看到的。由于抖动优化器内联方法以及移动代码以使程序运行得更快,映射是不完美的。
【讨论】:
【参考方案7】:您绝对应该使用堆栈跟踪,因为您可以使用只需要编写一次代码的全局异常捕获机制。
要获得引发错误的确切行,您需要将 pdb 文件与您的应用程序一起提供。这些 pdb 文件包含调试信息,包括错误的行号。
如果您想知道如何优雅地捕获未处理的异常,请查看this codeproject article。
【讨论】:
以上是关于如何在 vb.net 中使用 Stacktrace 返回错误行号的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 vb.net 2003 在 asp.net 1.1 中手动填充数据网格?