2009-04-10 8 views
0

비동기 I/O 및 AsyncCallbacks를 사용하여 I/O 완료를 처리하는 다중 스레드 .NET 응용 프로그램이 있습니다.비동기 I/O가 catch 할 수없는 예외를 throw 할 수 있습니까?

가 가, 캐치가 MyApp.cs에서

라인 (123)은 AsyncCallback의 첫 번째 실행 라인과는 시도/캐치 (예외 예)의 내부에 불과하다

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) 
: 드물게 응용 프로그램과 같은 예외와 함께 실패하지 않습니다 실행되지 않습니다.

예외가 발생한 지점에 대한 .NET Framework가 거짓말입니까? 예외를 실제로 잡을 수없는 비동기 netherworld에서 예외가 발생 했습니까? 왜 내가이 예외를 잡을 수 없습니까?

+2

이것은 매우 오래된 질문의 변종입니다. "하나님이 잡을 수없는 예외를 제기 할 수 있습니까?" –

+0

스택 추적에서 예외가 사용자의 메서드에서 비롯된 것으로 표시되는 경우에는 발생하지 않을 것으로 예상됩니다. 문제를 재현하는 코드를 게시 할 수 있습니까? 또한 InnerExceptions를 확인 했습니까? – driis

+0

비동기 I/O 중에 AritmeticException (또는 다른 예외)을 유발할 수 없기 때문에 문제를 재현하는 코드를 게시 할 수 없습니다. 내가 유도 한 예외는 예상대로 포착됩니다. 내부 예외는 없습니다. –

답변

0

실제 답변은 예입니다. .NET Framework는 예외가 발생한 곳이 잘못되었지만 예외가 비동기 netherworld에서 발생했기 때문에가 아닙니다. 예외는 실제로 스택 추적에 표시된 행 뒤의 많은 행에서 콜백 메소드에서 발생했습니다. 예외가 실제로 발생한 행은 try/catch 블록 내부가 아니므로 처리되지 않은 예외가 예상됩니다.

잘못된 스택 추적을 Microsoft에보고했지만 버그로 간주되는지는 알 수 없습니다.

스택 추적이 비동기 콜백 메서드의 첫 번째 실행 줄을 가리키는 경우 틀릴 수 있다고 생각하는 것이 안전하다고 생각합니다.

3

catch (Exception ex) 대신 catch를 사용해보십시오. 이것은 모든 것을 포함합니다. COM 예외.

관련 문제