我正在尝试为我的桌面应用程序构建错误处理程序。代码位于下面列出的类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
获取行号。实际上,这是确切的行号。
对这里发生了什么的任何想法,以及如何捕获错误发生的真实行号?
答案 0 :(得分:3)
修改:将代码更改为帐户Exception.StackTrace
为string
而非真实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方法来记录异常。