Может ли асинхронный ввод-вывод выдать неуловимое исключение? - PullRequest
0 голосов
/ 10 апреля 2009

У меня есть многопоточное приложение .NET, которое использует асинхронный ввод-вывод и AsyncCallbacks для обработки завершений ввода-вывода. В редких случаях приложение не работает с исключением, например:

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)

Строка 123 в MyApp.cs является первой исполняемой строкой AsyncCallback, и она находится внутри try / catch (исключение ex), но перехват НЕ выполняется.

.NET Framework мне лжет о том, где произошло исключение? Возникло ли исключение в асинхронном мире, где я не могу его поймать? Почему я не могу поймать это исключение?

Ответы [ 2 ]

3 голосов
/ 25 апреля 2009

Попробуйте использовать catch вместо catch (Exception ex). Это ловит все вкл. Исключения COM.

0 голосов
/ 04 сентября 2009

Фактический ответ - да, .NET Framework ошибся в том, где произошло исключение, но не потому, что исключение произошло в асинхронном мире преисподней. Исключение фактически произошло в методе обратного вызова, много строк после строки, указанной в трассировке стека. Строка, где на самом деле произошло исключение, НЕ была внутри блока try / catch, поэтому ожидалось необработанное исключение.

Я сообщил о неправильной трассировке стека в Microsoft, но понятия не имею, считается ли это ошибкой.

Я думаю, что можно с уверенностью сказать, что если ваша трассировка стека указывает на первую исполняемую строку асинхронного метода обратного вызова, вы должны подозревать, что это может быть неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...