を使用して呼び出している多くのメソッドがありますDelegate.DynamicInvoke
。これらのメソッドのいくつかはデータベース呼び出しを行います。私は、 a をキャッチし、 をキャッチせSqlException
ずTargetInvocationException
にその内部を調べて、実際に何が問題なのかを見つける機能を持ちたいと考えています。
このメソッドを使用して再スローしましたが、スタック トレースがクリアされます。
try
{
return myDelegate.DynamicInvoke(args);
}
catch(TargetInvocationException ex)
{
Func<TargetInvocationException, Exception> getInner = null;
getInner =
delegate(TargetInvocationException e)
{
if (e.InnerException is TargetInvocationException)
return getInner((TargetInvocationException) e.InnerException);
return e.InnerException;
};
Exception inner = getInner(ex);
inner.PreserveStackTrace();
throw inner;
}
メソッドは、別の投稿のおかげで修正した拡張メソッドです(PreserveStackTrace
実際に何をするかはわかりません)。ただし、これもトレースを保持していないようです。
public static void PreserveStackTrace(this Exception e)
{
var ctx = new StreamingContext(StreamingContextStates.CrossAppDomain);
var mgr = new ObjectManager(null, ctx);
var si = new SerializationInfo(e.GetType(), new FormatterConverter());
e.GetObjectData(si, ctx);
mgr.RegisterObject(e, 1, si);
mgr.DoFixups();
}