未捕获的异常在异步I / O中的位置

时间:2009-02-20 22:55:54

标签: c# exception

我正在开发一个基于控制台的.NET应用程序(使用mono)。我正在使用异步I / O(Begin / EndReceive)。

我正处于几层深度的回调链中间,如果抛出异常,它就不会被困在任何地方(将它冒出来到控制台是我所期望的,因为目前没有异常处理)。

但是,当我在堆栈跟踪发生时记录堆栈跟踪时,堆栈不会显示它返回到初始执行点。

我已尝试过AppDomain.UnhandledException技巧,但在这种情况下不起作用。

System.ArgumentOutOfRangeException: Argument is out of range.
Parameter name: size
  at System.Net.Sockets.Socket.BeginReceive (System.Byte[] buffer, Int32 offset, Int32 size, SocketFlags socket_flags, System.AsyncCallback callback, System.Object state) [0x00000] 
  at MyClass+State.BeginReceive () [0x00000] 

3 个答案:

答案 0 :(得分:2)

我相信在调用 EndAction 方法(在你的情况下是 EndReceive )时,应该抛出异步调用期间产生的任何错误。至少,这是我使用CLR(MSFT)实现所经历的,而Mono应该做同样的事情,虽然可能可能在这里略有错误(但考虑到这不太可能)。如果您在Visual Studio中,我建议您打开捕获所有异常的选项(i)在调试>例外菜单) - 也许在您使用的任何IDE中都有类似的选项?

答案 1 :(得分:0)

从堆栈的外观来看,BeginReceive中抛出了异常,因此根本没有启动特定的I / O操作。

线程池线程上未处理的异常的默认行为(因为CLR2.0)是终止进程,所以如果你没有看到这个,那么就会有一些东西正在捕获异常。

答案 2 :(得分:0)

使用Microsoft的.NET通常在异步调用期间引发的大多数异常都是在异步回调方法中引发的,除了极少数情况。为了处理其余部分,我通常设置一个超时回调方法。