リフレクションを介して、例外を引き起こす可能性のあるメソッドを呼び出しています。ラッパー リフレクションで囲むことなく、呼び出し元に例外を渡すにはどうすればよいですか?
InnerException を再スローしていますが、これによりスタック トレースが破壊されます。
サンプル コード:
public void test1()
{
// Throw an exception for testing purposes
throw new ArgumentException("test1");
}
void test2()
{
try
{
MethodInfo mi = typeof(Program).GetMethod("test1");
mi.Invoke(this, null);
}
catch (TargetInvocationException tiex)
{
// Throw the new exception
throw tiex.InnerException;
}
}
ベストアンサー1
.NET 4.5では、ExceptionDispatchInfo
クラス。
これにより、スタック トレースを変更せずに例外をキャプチャして再スローすることができます。
using ExceptionDispatchInfo =
System.Runtime.ExceptionServices.ExceptionDispatchInfo;
try
{
task.Wait();
}
catch(AggregateException ex)
{
ExceptionDispatchInfo.Capture(ex.InnerException).Throw();
}
これは だけでなく、あらゆる例外に対して機能しますAggregateException
。
これは、非同期言語機能を同期言語機能に近づけるために、インスタンスawait
から内部例外をアンラップする C# 言語機能によって導入されました。AggregateException