【问题标题】:How to use Stacktrace to return Error Line Number in vb.net如何在 vb.net 中使用 Stacktrace 返回错误行号
【发布时间】: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 吗?异常对象有一个很好的堆栈跟踪并包括行号。

标签: vb.net error-handling stack-trace erl


【解决方案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
    

    【讨论】:

    【解决方案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
    

    【讨论】:

    【解决方案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 答案显示了如何正确地做到这一点:stackoverflow.com/a/22338763/737393
      • @gchq 不要忘记将布尔参数添加到构造函数中。对我来说,在 VB.net VS13 Express 中使用 StackTrace 的无参数构造函数时它不起作用
      • 你能详细说明吗?
      【解决方案6】:

      在异常堆栈跟踪中生成行号是 CLR 的内置功能。但是,您必须提供将代码地址映射到行号所需的信息。切换到项目的发布配置。项目+属性,编译选项卡,高级编译选项。将“生成调试信息”设置从 pdb-only 更改为 Full。将 .pdb 文件与您的程序一起部署。

      请注意,您获得的行号始终是估计值,因此不要盲目相信您所看到的。由于抖动优化器内联方法以及移动代码以使程序运行得更快,映射是不完美的。

      【讨论】:

        【解决方案7】:

        您绝对应该使用堆栈跟踪,因为您可以使用只需要编写一次代码的全局异常捕获机制。

        要获得引发错误的确切行,您需要将 pdb 文件与您的应用程序一起提供。这些 pdb 文件包含调试信息,包括错误的行号。

        如果您想知道如何优雅地捕获未处理的异常,请查看this codeproject article

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多