12

我正在尝试创建某种错误捕获方法,该方法将返回错误行号。我们有一封中止电子邮件,当进程中止时发送给我们err.numbererr.description,但我想知道实际错误在哪里。

我知道您可以执行以下操作:

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

等等,并使用 ERL 来获取数字,但是这样输入每一行会很乏味。

有没有一种方法可以自动执行此操作,或者使用 Stacktrace 会更容易吗?如果 Stacktrace 更好,你能给我举个例子吗?

4

7 回答 7

16

我从其他论坛改编了一个例子,在我的例子中,我没有得到导致错误的行号,所以我开始玩弄并找到了解决方案,代码如下:

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

于 2013-10-13T17:57:22.970 回答
11

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

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

于 2012-11-19T19:36:05.667 回答
1
    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
于 2017-08-01T13:08:30.663 回答
0

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

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

如果您想知道如何优雅地捕获未处理的异常,请查看这篇 codeproject 文章

于 2012-11-19T19:35:41.797 回答
0
    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
于 2017-07-31T21:44:43.250 回答
0

如果您希望继续使用 On Error Goto,只需将代码复制并粘贴到 UltraEdit 等程序员编辑器中,然后在单列编辑操作中插入所有行号。确保突出显示第一列,然后使用列/插入编号...

然后将其复制并粘贴回您的程序中。瞧,除了选择案例语句之后的第一个案例。在每个选择案例之后从第一个案例条目中删除您插入的行号。

于 2019-11-15T03:47:27.843 回答
-1

您可以使用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
于 2016-04-12T07:10:08.647 回答