Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步I/O能否引发不可修补的异常?_C#_.net_Exception_Asynchronous - Fatal编程技术网

C# 异步I/O能否引发不可修补的异常?

C# 异步I/O能否引发不可修补的异常?,c#,.net,exception,asynchronous,C#,.net,Exception,Asynchronous,我有一个多线程的.NET应用程序,它使用异步I/O和异步回调来处理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.Context

我有一个多线程的.NET应用程序,它使用异步I/O和异步回调来处理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(Exception ex)中,但是没有执行catch


关于异常发生的位置,.NET Framework是否对我撒谎?异常是否真的发生在我无法捕捉到的异步地狱中?为什么我不能捕获此异常?

尝试使用catch而不是catch(异常示例)。这将捕获所有内容,包括COM异常。

尝试使用catch而不是catch(异常示例)。这将捕获所有内容,包括.COM异常。

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

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


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

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

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


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

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