【发布时间】:2011-06-01 03:12:43
【问题描述】:
我有许多使用Delegate.DynamicInvoke 调用的方法。其中一些方法会调用数据库,我希望能够捕获 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();
}
【问题讨论】:
标签: c# exception-handling stack-trace targetinvocationexception inner-exception