не найдено
я есть много методов, которые вызывают с помощью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();
}