码迷,mamicode.com
首页 > 其他好文 > 详细

TPL - Part 2 异常处理常用方式

时间:2015-04-18 13:08:31      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

异常处理常用方式

Task task1 = new Task(() => {
ArgumentOutOfRangeException exception = new ArgumentOutOfRangeException();
exception.Source= "task1";
throw exception;
});
Task task2 = new Task(() => {
throw new NullReferenceException();
});
Task task3 = new Task(() => {
Console.WriteLine("Hello from Task 3");
});

task1.Start();task2.Start(); task3.Start();
try{
Task.WaitAll(task1,task2, task3);
} catch(AggregateException ex) {
//enumerate the exceptions that have been aggregated
foreach(Exception inner in ex.InnerExceptions) {
Console.WriteLine("Exception type {0} from {1}",
inner.GetType(),inner.Source);
}
}


以上代码中,创建了3个task,分别抛出不同的异常类型,在UI线程中使用AggregateException来GetType并获取Source来获得异常信息做不同的处理。

使用异常处理代理

在上述代码的catch中,可以使用如下代码完成通过代理处理异常:

try {
Task.WaitAll(task1, task2);
} catch (AggregateException ex) {
ex.Handle((inner) => {
if (inner is OperationCanceledException) {
// ...handle task cancellation...
return true;
} else {
return false;
}


上述代码使用了1个代理来接收每个AggregateException中的每个异常并进行处理。有关更多Task的属性还有Task.IsCompleted,Task.IsFaulted,Task.IsCanceled分别用于获取是否完成,是否出错,是否取消。

如果Task中的异常没有被处理,那么在Task被回收时程序会被终止,由于Task被回收的时间不能确定,程序终止的时间也不能确定,因此一定要处理好Task中的异常。

在全局范围处理Task遗漏的异常

TaskScheduler.UnobservedTaskException +=
(object sender, UnobservedTaskExceptionEventArgs eventArgs) =>
{
eventArgs.SetObserved();
((AggregateException)eventArgs.Exception).Handle(ex=> {
//addlog here
Console.WriteLine("Exception type: {0}, Source : {1}", ex.GetType(), ex.Source);
return true;
});
};
//create tasks that will throw an exception
Task task1 = new Task(() => {
throw new NullReferenceException();
});
Task task2 = new Task(() => {
throw new ArgumentOutOfRangeException();
});
// startthe tasks
task1.Start();task2.Start();
 
while(!task1.IsCompleted || !task2.IsCompleted){
Thread.Sleep(200);
}


以上代码中,开启了两个Task,并在TaskScheduler中捕捉Task中没有捕捉到的异常。

TPL - Part 2 异常处理常用方式

标签:

原文地址:http://blog.csdn.net/lan_liang/article/details/45112359

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!