kaybetmeden nasıl yeniden işlersiniz Delegate.DynamicInvoke
kullanarak çağıran birçok yöntem var. Bu yöntemlerden bazıları veritabanı çağrıları yapar ve SqlException
'u yakalama ve TargetInvocationException
'u yakalama ve aslında neyin yanlış gittiğini bulmak için içlerinden avlanma yeteneğine sahip olmak isterim.Bir TargetInvocationException iç istisnasını yığın izleme
Ben rethrow için bu yöntemi kullanıyordu ama yığın izleme temizler:
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
yöntem başka bir yazı sayesinde yukarı sabit bir uzantısı yöntemidir (Ben aslında ne bilmiyorum) . Bununla birlikte, bu her iki iz korumak için görünmez:
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();
}
Not için ilginç nokta: 4'te ExceptionDispatchInfo.5, 4.0 veya 4.5 hedeflemenize bağlı olarak istisnaları yeniden düzenlerken Rx'ten farklı çağrı yığınları gördüğünüz anlamına gelir. İşlenmemiş OnErrors, 4.5'i hedeflerken değil, 4.5'i hedeflerken orijinal yığın iziyle yeniden oluşturulacaktır. –