在匿名方法中执行任务时捕获抛出的异常
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);
}
}
}
我无法控制 类 A
和 B
问题是当
throw new Exception("Blah");
碰巧我的代码无法捕获异常。
我的代码如何捕获该异常?
由于您无法控制 类,因此您无法捕获异常。在您已经完成调用事件后 抛出异常 ,因此您已经(至少可能)在事件发生时离开了 try
块抛出。该事件需要专门设计为支持处理异步方法处理程序的错误,以便能够处理此类异常。
你不能。如果您不能更改这些 类 的代码,您就无法 捕获 那个异常。
但是,您可以通过订阅 TaskScheduler.UnobservedTaskException
GC 收集该任务时将引发的事件来通知您。
我有一个类似的代码:
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);
}
}
}
我无法控制 类 A
和 B
问题是当
throw new Exception("Blah");
碰巧我的代码无法捕获异常。
我的代码如何捕获该异常?
由于您无法控制 类,因此您无法捕获异常。在您已经完成调用事件后 抛出异常 ,因此您已经(至少可能)在事件发生时离开了 try
块抛出。该事件需要专门设计为支持处理异步方法处理程序的错误,以便能够处理此类异常。
你不能。如果您不能更改这些 类 的代码,您就无法 捕获 那个异常。
但是,您可以通过订阅 TaskScheduler.UnobservedTaskException
GC 收集该任务时将引发的事件来通知您。