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

Catch exception thrown while task execution in anonymous method

我有一个类似的代码:

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

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

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

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

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