Como relançar a exceção interna de uma TargetInvocationException sem perder o rastreamento de pilha
Eu tenho muitos métodos que estão chamando usandoDelegate.DynamicInvoke
. Alguns desses métodos fazem chamadas ao banco de dados e eu gostaria de ter a capacidade de capturar umSqlException
e não pegar oTargetInvocationException
e vasculhe suas entranhas para descobrir o que realmente deu errado.
Eu estava usando esse método para retroceder, mas ele limpa o rastreamento de pilha:
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;
}
oPreserveStackTrace
O método é um método de extensão que eu consertei graças a outro post (não sei o que ele realmente faz). No entanto, isso também não parece preservar o rastreamento:
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();
}