0

我正在处理 Windows 窗体的主入口点中的顶级异常。我想访问在我的处理程序中导致异常的调用方法/程序集。我有一种感觉,我将不得不为此使用跟踪,但我不确定在哪里。

Module Program
  Sub Main()
    Try
      AddHandler AppDomain.CurrentDomain.UnhandledException, Function(sender, e) ExceptionHandler.Handle(sender, DirectCast(e.ExceptionObject, Exception))
      AddHandler Application.ThreadException, Function(sender, e) ExceptionHandler.Handle(sender, e.Exception)
      Application.Run(ApplicationBase)
    Catch ex As Exception
      MessageBox.Show("Handled Exception")
    End Try
  End Sub
End Module

Public Class ApplicationBase
  Public Sub MethodA()
    'Causes an exception
    File.ReadAllLines("")
  End Sub
End Class

Public Class ExceptionHandler

  Public Shared Function Handle(sender As Object, e As Exception)
    Dim t As Type = sender.GetType()
    'Retrieve the calling method here?
    Dim callingMethod = "MethodA"
    Return True
  End Function

End Class

作为发送者通过的对象是一个线程,我试图查看这是否是调用导致异常的程序集/对象类型。

我的问题是,如果可能的话,如何从“句柄”方法中获取方法名称/信息并推送对象名称/程序集?

编辑:

虽然 e.ToString() 将显示方法名称 - 我正在寻找对方法信息列表/程序集/引发异常的类型(如反射)的访问,然后我可以获得 .DLL 的版本号等 -我可能在这里做梦,但我想知道这是否可能?

编辑2:

我尝试了 e.TargetSite,它对于 MethodA() 异常返回 File.ReadAllLines() 的方法信息我正在寻找导致异常的 Class 方法,因此方法信息将是 MethodA - 虽然这比我要接近得多我想我会得到。

4

3 回答 3

2

如果您想知道哪个方法引发了异常,您可以使用Exception.TargetSite属性;它返回一个MethodBase.

如果引发此异常的方法不可用并且堆栈跟踪不是空引用(在 Visual Basic 中为 Nothing),TargetSite 从堆栈跟踪中获取该方法。如果堆栈跟踪是一个空引用,TargetSite 也会返回一个空引用。

如果您想在异常发生时遍历堆栈跟踪以查找代码中的方法(而不是库代码中的方法),您将必须自己分析堆栈跟踪。

您可以获得异常的堆栈跟踪:

Dim stackTrace = new StackTrace(ex)

您可以按索引获取单个堆栈帧:

Dim stackFrame = stackTrace.GetFrame(index)

您可以从堆栈帧中获取信息:

Dim method = stackFrame.GetMethod()

然后,您必须提出一种算法,从上到下遍历堆栈跟踪,寻找满足您的标准的第一帧作为您要报告的堆栈帧。这是一个非常简单的算法,可以找到执行程序集中的第一帧。

Dim stackTrace = new StackTrace(ex)
Dim i As Integer
For i = 0 To stackTrace.FrameCount - 1
  Dim stackFrame = stackTrace.GetFrame(i)
  Dim method = stackFrame.GetMethod()
  If (method.DeclaringType.Assembly = Assembly.GetExecutingAssembly()) Then
    ' Found the method - do something and exit the loop
    Exit For
  End If
Next i
于 2012-09-04T13:48:49.633 回答
1

e.ToString()将返回完整的详细信息,包括堆栈跟踪。堆栈跟踪包括所有方法名称。

于 2012-09-04T13:42:19.273 回答
0

[已编辑]

看看如何在 C# 中格式化异常的堆栈跟踪?. 使用接受异常的System.Diagnostics.StackTrace的构造函数。

于 2012-09-04T13:47:46.187 回答