【问题标题】:Catch exception thrown while task execution in anonymous method在匿名方法中执行任务时捕获异常
【发布时间】:2016-02-09 04:12:42
【问题描述】:

我有一个类似这样的代码:

class A
{
    public Action<int, int> OnAddition;

    public int Add(int val1, int val2)
    {
        if (OnAddition != null)
        {
            OnAddition(val1, val2);
        }

        return val1 + val2;
    }
}

class B
{
    A a = new A();

    public B()
    {
        a.OnAddition = (v1, v2) =>
        {
            Task.Run(() =>
            {
                Console.WriteLine("Adding {0} and {1}", v1, v2);
                throw new Exception("Blah");
            });
        };
    }

    public int Add(int val1, int val2)
    {
        return a.Add(val1, val2);
    }
}

class Program
{
    static void Main(string[] args)
    {
        try
        {
            B b = new B();

            Console.WriteLine(b.Add(1, 7));
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

我无法控制 AB 类,问题是当 throw new Exception("Blah"); 发生我的代码无法捕获异常。

我的代码如何捕获该异常?

【问题讨论】:

    标签: c# .net task-parallel-library system.reactive


    【解决方案1】:

    你不能。如果您无法更改这些类的代码,则无法捕获该异常。

    但是,您可以通过订阅TaskScheduler.UnobservedTaskException 事件来通知它,该事件将在 GC 收集该任务时引发。

    【讨论】:

      【解决方案2】:

      由于您无法控制类,因此您无法捕获异常。 在你已经完成调用事件之后抛出了异常,所以在事件被抛出时你已经(至少可能)离开了try 块。该事件需要专门设计为支持异步方法处理程序的错误处理,以便能够处理此类异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-05
        • 1970-01-01
        相关资源
        最近更新 更多