【问题标题】:Can an async I/O throw an uncatchable exception?异步 I/O 会抛出无法捕获的异常吗?
【发布时间】:2009-04-10 17:19:29
【问题描述】:

我有一个多线程 .NET 应用程序,它使用异步 I/O 和 AsyncCallbacks 来处理 I/O 完成。在极少数情况下,应用会失败并出现以下异常:

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 是否在异常发生的位置上对我撒谎?异常是否真的发生在我无法捕捉到的异步地狱中?为什么我无法捕捉到这个异常?

【问题讨论】:

  • 这是一个非常古老的问题的变体:“上帝能提出一个他无法捕捉的异常吗?”
  • 我预计不会发生这种情况,至少如果堆栈跟踪显示异常源自您的方法时不会发生。你能发布一些重现问题的代码吗?另外,你检查过 InnerExceptions 吗?
  • 我无法发布重现问题的代码,因为我无法在异步 I/O 期间引发 AritmeticException(或任何其他异常)。我引发的任何异常都会按预期捕获。没有内部异常。

标签: c# .net exception asynchronous


【解决方案1】:

尝试使用 catch 而不是 catch(Exception ex)。这可以捕获所有内容,包括。 COM 异常。

【讨论】:

    【解决方案2】:

    实际的答案是肯定的,.NET Framework 关于异常发生的位置是错误的,但不是因为异常发生在异步下界。异常实际上发生在回调方法中,在堆栈跟踪中指示的行之后的许多行。实际发生异常的行不在 try/catch 块内,因此预期会出现未处理的异常。

    我向 Microsoft 报告了错误的堆栈跟踪,但不知道它是否被视为错误。

    我认为可以肯定地说,如果您的堆栈跟踪指向异步回调方法的第一个可执行行,您应该怀疑它可能是错误的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-22
      • 2013-10-03
      • 2021-09-02
      • 2020-01-28
      • 2012-09-14
      • 2021-10-09
      • 2012-02-03
      • 2011-04-05
      相关资源
      最近更新 更多