我有很多使用Delegate.DynamicInvoke
. 其中一些方法会进行数据库调用,我希望能够捕获 aSqlException
而不是捕获 theTargetInvocationException
并通过其内部查找实际出了什么问题。
我正在使用这种方法重新抛出,但它清除了堆栈跟踪:
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();
}