在匿名方法中执行任务时抛出异常

时间:2016-02-08 20:08:20

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

我有类似的代码:

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");我的代码无法捕获异常。

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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