在线程执行的地方使用try..catch..捕获不到异常,在调用Task的Wait()方法或Result属性处会抛出Task中的异常。
Task中可能会抛出多个异常,应该使用AggregateException捕获多线程中所有异常。AggregateException是一个集合
但是如果没有返回结果,或者不想调用Wait()方法,该怎么获取异常呢?
首先,线程内部不应该出现异常,所以首选处理方式是在Task中使用try..catch..把异常处理掉
如果不可以在内部捕获,可以使用ContinueWith()方法捕获异常
1 var t = Task.Run<int>(() =>
2 {
3 throw new Exception("error");
4 Console.WriteLine("action do do do");
5 return 1;
6 }).ContinueWith<Task<int>>((t1) => {
7 if (t1 != null && t1.IsFaulted)
8 {
9 Console.WriteLine(t1.Exception.Message); //记录异常日志
10 }
11 return t1;
12 }).Unwrap<int>();
上面使用起来比较麻烦,添加一个扩展方法:
1 public static Task Catch(this Task task)
2 {
3 return task.ContinueWith<Task>(delegate(Task t)
4 {
5 if (t != null && t.IsFaulted)
6 {
7 AggregateException exception = t.Exception;
8 Trace.TraceError("Catch exception thrown by Task: {0}", new object[]
9 {
10 exception
11 });
12 }
13 return t;
14 }).Unwrap();
15 }
16 public static Task<T> Catch<T>(this Task<T> task)
17 {
18 return task.ContinueWith<Task<T>>(delegate(Task<T> t)
19 {
20 if (t != null && t.IsFaulted)
21 {
22 AggregateException exception = t.Exception;
23 Trace.TraceError("Catch<T> exception thrown by Task: {0}", new object[]
24 {
25 exception
26 });
27 }
28 return t;
29 }).Unwrap<T>();
30 }