Как повторно вызвать внутреннее исключение TargetInvocationException без потери трассировки стека

У меня есть много методов, которые вызываются с использованием 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(); 
}
20
задан David Neale 29 December 2010 в 16:22
поделиться