构建一个真正的错误处理程序

时间:2010-06-04 20:27:39

标签: vb.net desktop-application

我正在尝试为我的桌面应用程序构建错误处理程序。代码位于下面列出的类ZipCM.ErrorManager中。

我发现输出的文件没有给我正确的StackTrace信息。

以下是我尝试使用它的方法:

Try
     '... Some stuff here!

     Catch ex As Exception
            Dim objErr As New ZipCM.ErrorManager
            objErr.Except = ex
            objErr.Stack = New System.Diagnostics.StackTrace(True)
            objErr.Location = "Form: SelectSite (btn_SelectSite_Click)"
            objErr.ParseError()
            objErr = Nothing
        End Try

这是班级:

    Imports System.IO

Namespace ZipCM

    Public Class ErrorManager

        Public Except As Exception
        Public Location As String
        Public Stack As System.Diagnostics.StackTrace

        Public Sub ParseError()
            Dim objFile As New StreamWriter(Common.BasePath & "error_" & FormatDateTime(DateTime.Today, DateFormat.ShortDate).ToString().Replace("\", "").Replace("/", "") & ".log", True)
            With objFile
                .WriteLine("-------------------------------------------------")
                .WriteLine("-------------------------------------------------")
                .WriteLine("An Error Occured At: " & DateTime.Now)
                .WriteLine("-------------------------------------------------")
                .WriteLine("LOCATION:")
                .WriteLine(Location)
                .WriteLine("-------------------------------------------------")
                .WriteLine("FILENAME:")
                .WriteLine(Stack.GetFrame(0).GetFileName())
                .WriteLine("-------------------------------------------------")
                .WriteLine("LINE NUMBER:")
                .WriteLine(Stack.GetFrame(0).GetFileLineNumber())
                .WriteLine("-------------------------------------------------")
                .WriteLine("SOURCE:")
                .WriteLine(Except.Source)
                .WriteLine("-------------------------------------------------")
                .WriteLine("MESSAGE:")
                .WriteLine(Except.Message)
                .WriteLine("-------------------------------------------------")
                .WriteLine("DATA:")
                .WriteLine(Except.Data.ToString())
            End With
            objFile.Close()
            objFile = Nothing
        End Sub

    End Class

End Namespace

发生的事情是.GetFileLineNumber()objErr.Stack = New System.Diagnostics.StackTrace(True)块中的Try..Catch获取行号。实际上,这是确切的行号。

对这里发生了什么的任何想法,以及如何捕获错误发生的真实行号?

3 个答案:

答案 0 :(得分:3)

修改:将代码更改为帐户Exception.StackTracestring而非真实StackTrace

您正在创建一个新的StackTrace,因此它将用于您声明它的行,如果您想要原始异常的行号,请使用{{1}中的堆栈跟踪}。

我觉得你有点困惑,我不明白你为什么要创建新的StackTrace?

编辑:在答案中添加了更多位,因为更容易看到语法而不是注释

目前你有一行

Exception.StackTrace

这意味着您正在创建一个全新的堆栈跟踪,从您创建它开始。

而是将该行更改为:

 objErr.Stack = New System.Diagnostics.StackTrace(True)

实际发生错误的时候会有堆栈跟踪。

编辑:添加完整示例:

objErr.Stack = New System.Diagnostics.StackTrace(ex, True)

答案 1 :(得分:1)

已解决:您应该更改原始代码的错误指令:

.WriteLine(Stack.GetFrame(0).GetFileLineNumber())

这个新的:

.WriteLine(Stack.GetFrame(Stack.FrameCount - 1).GetFileLineNumber)

你会看到,它将返回确切的Line_Number代码 运行时错误发生的地方!!

答案 2 :(得分:0)

您不需要为ErrorManager包含Stack属性,因为您可以通过异常访问堆栈跟踪。

根据经验,我会在Shared Sub Write(ex As Exception, location As String)上创建ErrorManager方法,并在您的Catch语句中调用:

ZipCM.ErrorManager.Write(ex, "Form: SelectSite (btn_SelectSite_Click)")

此更改导致代码更清晰,减少了在每个Catch语句中编写大量代码的需要,并允许您更改Write的实现,而无需重新访问/重做/重构每个Catch语句。

例如,您可以将Write方法更改为也调用Debug.WriteLine(ex),这样您就可以在调试期间查看正在处理的异常,而无需打开文件。此外,您可能希望包含显示异常消息框的WriteNotify方法,然后调用Write方法来记录异常。