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:

MethodA() 例外に対して File.ReadAllLines() のメソッド情報を返す e.TargetSite を試しました。例外を引き起こす Class メソッドを探しているので、メソッド情報は MethodA になります - これは私よりもずっと近いですが私が得るであろう考えの。

4

3 に答える 3

2

どのメソッドが例外をスローしたかを知りたい場合は、Exception.TargetSiteプロパティを使用できます。を返しますMethodBase

この例外をスローするメソッドが使用できず、スタックトレースがnull参照ではない場合(Visual BasicではNothing)、TargetSiteはスタックトレースからメソッドを取得します。スタックトレースがnull参照の場合、TargetSiteもnull参照を返します。

例外時にスタックトレースを調べて、コード内のメソッド(ライブラリコード内のメソッドではなく)を見つける場合は、スタックトレースを自分で分析する必要があります。

例外のスタックトレースを取得できます。

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

【編集済】

How to format Exception's stack trace in C#? をご覧ください。. 例外を受け取る System.Diagnostics.StackTraceのコンストラクターを使用します。

于 2012-09-04T13:47:46.187 に答える