C# 使用StackTrace记录异常

C# 使用StackTrace记录异常,c#,vb.net,C#,Vb.net,我想记录异常详细信息 文件名、FileLineNo、方法名(发生异常的位置) 这是使用StackTrace类实现的 但有时我会将文件行号和方法名设置为null 发生异常时,我如何始终跟踪异常详细信息 这是我的密码 Public Shared Sub LogException(ByVal ex As Exception) Dim trace As Diagnostics.StackTrace = New Diagnostics.StackTrace(ex, True) LogInfo(Strin

我想记录异常详细信息 文件名、FileLineNo、方法名(发生异常的位置) 这是使用StackTrace类实现的 但有时我会将文件行号和方法名设置为null 发生异常时,我如何始终跟踪异常详细信息

这是我的密码

Public Shared Sub LogException(ByVal ex As Exception)

Dim trace As Diagnostics.StackTrace = New Diagnostics.StackTrace(ex, True)
LogInfo(String.Format("Error Message :{0}  => Error In :{1}  => Line Number :{2} => Error Method:{3}",
                              ex.Message, trace.GetFrame(0).GetFileName(),
                              trace.GetFrame(0).GetFileLineNumber(),
                              trace.GetFrame(0).GetMethod().Name))
End Sub

异常已包含完整堆栈跟踪。您不需要创建新的堆栈跟踪。

1)您可以使用从Exception对象内部获取堆栈跟踪。你不需要创建一个新的


2) 如果异常是从您没有调试信息的地方抛出的(例如在框架内),您可能根本没有行号或源文件名可获取。

因此,一次回答您所有问题的答案可能是:“捕获的异常将具有它可能具有的所有详细信息。”

您的公共共享子LogException正在获取一个异常对象,该对象将已经包含大部分信息。所以,你可以做

LogInfo(ex.ToString())
…并获得尽可能多的细节

在某些情况下,您可能没有文件名或行号,在某些情况下,您的LogInfo语句本身会引发异常。说明如何可靠地获取这些详细信息,尽管这会带来潜在的安全风险

我发现exception.ToString()中包含的异常类型和堆栈跟踪信息通常足以确定实际错误。如果不是,则通常是代码结构的问题