如何使用堆栈跟踪来在vb.net返回错误行号(How to use Stacktrace to re

2019-08-02 22:56发布

我试图建立某种形式的错误捕获方法将返回错误行号。 我们有一个发送出去当一个进程中止,让我们的Err.Numbererr.description,但我想知道这里居然是出现了错误中止电子邮件。

我知道你可以做到以下几点:

1: code here
2: code here
3: code here

等,并使用ERL拿到的数目,但它会乏味键入每行出这样的。

有两种办法来自动执行此操作,或使用堆栈跟踪将是更容易? 如果堆栈跟踪是更好的可以请你告诉我一个例子?

Answer 1:

在异常堆栈跟踪生成行号是一个内置功能的CLR。 然而,你必须提供它需要一个代码地址映射到行号的信息。 切换到项目的Release配置。 项目+属性,编译选项卡,高级编译选项。 更改“生成调试信息”从PDB-才完全设置。 部署.pdb文件与程序一起。

要注意的是你得到的行数始终是一个估计,所以不要盲目地相信你所看到的。 映射不完善由于抖动优化内联和以其他方式走动的代码,使程序运行速度更快。



Answer 2:

我已经适应了从其他论坛上的例子,在我的情况,我没有得到地方错误是造成行号,所以我就开始玩了一圈,发现一个解决方案,代码如下:

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,我得到了导致问题的行号。



Answer 3:

你一定要使用堆栈跟踪,因为你可以使用全局异常捕获机制,你需要的代码只有一次。

要获得其抛出的错误的确切行,你会需要装运与应用程序的pdb文件。 这些PDB文件包含调试信息,包括错误的行号。

如果你想知道如何优雅地捕获未处理的异常,看看这个CodeProject上的文章 。



Answer 4:

    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


Answer 5:

    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


Answer 6:

您可以使用堆栈跟踪检索有关错误的行号。

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


文章来源: How to use Stacktrace to return Error Line Number in vb.net