zoukankan      html  css  js  c++  java
  • 异步异常在调试中无法捕获

     

    问题描述

    有这样一段测试代码

       1: static void Main(string[] args)
       2:  {
       3:      Action funcDelegate = TestFunc;
       4:      funcDelegate.BeginInvoke(Done, funcDelegate);
       5:      Console.ReadKey();
       6:  }
       7:  
       8:  static void Done(IAsyncResult ar)
       9:  {
      10:      try
      11:      {
      12:          var funcDelegate =  (Action)ar.AsyncState;
      13:          funcDelegate.EndInvoke(ar);
      14:      } catch(Exception e)
      15:      {
      16:          Console.WriteLine("Get the Async Excetion :{0}",e.Message);
      17:      }
      18:  }
      19:  
      20:  static void TestFunc()
      21:  {
      22:      Thread.Sleep(2000);
      23:      throw new Exception("TestFuncException");
      24:  }

    首先,这段代码是没有问题的。如果想在异步调用中处理异常,必须在EndInvoke中处理。

    但是如果这个时候你使用F5调试,就会提醒异常没有被处理。(VS2010亲测,VS2012似乎也没能处理这个问题)

    解决方法

    问题出在调试器上,他发现执行异步操作的线程栈里面没有处理方案。

    所以只需要用Ctrl+F5运行就可以发现,程序实际上有捕捉到异常。

    CLR有对异步调用的异常有一些特别的处理。

    这里还有一个更有意思的东西,似乎部分基于EAP设计的类,出来的异步异常是可以被捕获到的。

    我不清楚内部的机理

  • 相关阅读:
    【z02】选择客栈
    JavaEE(22)
    驱动表问题
    影响子查询展开的情况
    SQL*Net message from client
    等值链接和非等值链接
    ||拼接列关联和直接关联区别
    分页SQL优化
    SQL*Net more data to client
    SQL*Net message to client
  • 原文地址:https://www.cnblogs.com/atskyline/p/2707272.html
Copyright © 2011-2022 走看看