簡體   English   中英

異步I / O可以引發不可捕獲的異常嗎?

[英]Can an async I/O throw an uncatchable exception?

我有一個使用異步I / O和AsyncCallbacks處理I / O完成的多線程.NET應用程序。 極少數情況下,該應用程序會因以下異常而失敗:

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)

MyApp.cs中的第123行是AsyncCallback的第一行可執行文件,它位於try / catch(異常ex)中,但是未執行catch。

.NET Framework是否向我撒謊說明發生異常的地方? 異常確實發生在我無法捕獲的異步網絡中嗎? 為什么我無法捕獲此異常?

嘗試使用catch而不是catch(異常ex)。 這包括一切。 COM異常。

實際答案是肯定的,.NET Framework錯誤發生的位置是錯誤的,但這不是因為異常是在異步網絡中發生的。 異常實際上發生在回調方法中,位於堆棧跟蹤中指示的行之后的許多行。 實際發生異常的行不在try / catch塊內,因此,未處理的異常是可以預期的。

我向Microsoft報告了錯誤的堆棧跟蹤,但是不知道是否將其視為錯誤。

我認為可以肯定地說,如果您的堆棧跟蹤指向異步回調方法的第一行可執行代碼,那么您應該懷疑這可能是錯誤的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM