如何在 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.numbererr.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中使用.eof OR .bof条件?

如何在 VB.Net 的虚拟键语句中使用变量

如何使用 vb.net 2003 在 asp.net 1.1 中手动填充数据网格?

如何在 VB.NET 中使用 protobuf-net 添加枚举?

如何使用VB.NET在Access数据库中插入多条记录

如何在 VB.NET 中使用 OleDbDataReader 搜索数据?