それはたStackFrameにだが...単に実行最後として返されるのロギングハンドラクラス内のメソッドを排除します方法。ロギングハンドラクラスは単に例外を記録するだけではなく、新しいStackTraceオブジェクトが必要でした。明らかに、「例外を投げたメソッド」を見つけるために、GetType()は必要ないかもしれません。
スタックの一番上が必要な場合は、最初のフレームを取得し、GetMethod()を呼び出して返すか、単にTargetSiteを使用します。 GetType()を削除することができました。 StackTraceオブジェクトを作成するには、例外を渡す必要があることにも注意してください。例:
class Program
{
static void Main(string[] args)
{
try
{
Test();
}
catch (Exception ex)
{
// does not work properly - writes "Main"
Console.WriteLine(MethodBase.GetCurrentMethod());
// properly writes "TestConsole.Program.Test"
Console.WriteLine(GetExecutingMethodName(ex));
// properly writes "Test"
Console.WriteLine(ex.TargetSite.Name);
}
Console.ReadKey();
}
static void Test()
{
throw new Exception("test");
}
private static string GetExecutingMethodName(Exception exception)
{
var trace = new StackTrace(exception);
var frame = trace.GetFrame(0);
var method = frame.GetMethod();
return string.Concat(method.DeclaringType.FullName, ".", method.Name);
}
}
基本的に、TargetSite()が必要な処理を行う場合、それ以上は実行しないでください。しかし、多くの場合、ロギングハンドラでは、例外オブジェクトは利用できません(つまり、トレースと監査)ので、最後に実行されたメソッドを取得するために新しいStackTrace()オブジェクトが必要になります。
簡単な答えは?コールスタックの一番上にあるメソッドです。これは、例外が発生する前に最近呼び出されたメソッドです。 :) – Chiramisu
私はこの回答をチェックして解決しました。http://stackoverflow.com/questions/27997276/get-method-name-that-threw-exception –