2009-04-10 14 views
0

Ich habe eine .NET-Anwendung mit mehreren Threads, die asynchrone E/A- und AsyncCallbacks verwendet, um die E/A-Vervollständigungen zu verarbeiten. In seltenen Fällen wird die App mit einer Ausnahme fehlschlagen wie:Kann ein asynchroner E/A eine nicht behebbare Ausnahme auslösen?

Arithmetic operation resulted in an overflow. 
    at MyApp.ReadComplete(IAsyncResult ar) in c:\MyApp.cs:line 123 
    at System.Net.LazyAsyncResult.Complete(IntPtr userToken) 
    at System.Net.ContextAwareResult.CompleteCallback(Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Net.ContextAwareResult.Complete(IntPtr userToken) 
    at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken) 
    at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped) 
    at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP) 

Linie 123 in MyApp.cs ist die erste ausführbare Zeile des AsyncCallback und es ist innerhalb eines try/catch (Exception ex), aber der Haken ist, NICHT ausgeführt werden.

Liegt mir das .NET Framework vor, wo die Ausnahme aufgetreten ist? Ist die Ausnahme tatsächlich in der asynchronen Unterwelt aufgetreten, wo ich sie nicht finden kann? Warum kann ich diese Ausnahme nicht verstehen?

+2

Dies ist eine Variante einer sehr alten Frage: "Kann Gott eine Ausnahme aufstellen, die er nicht fangen kann?" –

+0

Ich würde nicht erwarten, dass das passieren könnte, zumindest nicht, wenn der Stack-Trace zeigt, dass die Ausnahme in Ihrer Methode entstanden ist. Können Sie Code posten, der das Problem reproduziert? Haben Sie auch InnerExceptions überprüft? – driis

+0

Ich kann keinen Code posten, der das Problem reproduziert, da ich keine AritmeticException (oder eine andere Ausnahme) während der asynchronen E/A auslösen kann. Jede Ausnahme, die ich induziere, wird wie erwartet gefangen. Es gibt keine inneren Ausnahmen. –

Antwort

0

Die tatsächliche Antwort ist ja, das .NET Framework war falsch, wo die Ausnahme aufgetreten ist, aber nicht, weil die Ausnahme in der asynchronen netherworld aufgetreten ist. Die Ausnahme trat tatsächlich in der Callback-Methode auf, viele Zeilen nach der im Stack-Trace angegebenen Zeile. Die Zeile, in der die Ausnahme tatsächlich aufgetreten ist, befand sich NICHT in einem try/catch-Block, daher wurde die unbehandelte Ausnahme erwartet.

Ich habe den falschen Stack-Trace an Microsoft gemeldet, habe aber keine Ahnung, ob es sich um einen Bug handelt.

Ich denke, es ist sicher zu sagen, dass, wenn Ihre Stack-Trace auf die erste ausführbare Zeile einer asynchronen Callback-Methode zeigt, sollten Sie vermuten, dass es falsch sein könnte.

3

Versuchen Sie, Fang statt Fang zu verwenden (Ausnahme ex). Das fängt alles ein inkl. COM-Ausnahmen

Verwandte Themen