任何程式都避免異常情況發生.那麼如何在發生異常情況時,很好的處理掉異常,以便是我們的程式繼續良好的運作呢?那麼介紹幾種處理.Net中并行程式設計處理異常的幾種方式.
方法1: AggregateException
表示在應用程式執行期間發生的一個或多個錯誤.
當使用某個靜态或執行個體任務類Task的Wait(),WaitAll(),WaitAny()方法和Result屬性時,會傳播異常,您可通過将調用包括在 try-catch 語句中來處理這些異常。 如果任務是所附加子任務的父級,或者您在等待多個任務,則可能會引發多個異常。 為了将所有異常傳播回調用線程,任務基礎結構會将這些異常包裝在 AggregateException 執行個體中。 AggregateException 具有一個 InnerExceptions 屬性,可枚舉該屬性來檢查引發的所有原始異常,并單獨處理(或不處理)每個異常。 即使隻引發了一個異常,也仍會将該異常包裝在 AggregateException 中。例子如下:
static void DealException()
{
Task task1 = new Task(() =>
{
throw new NotImplementedException("沒有實作");
});
Task task2 = new Task(() =>
throw new ArgumentNullException("參數空");
});
Task task3 = new Task(() =>
throw new Exception("異常");
Task task4 = new Task(() =>
Console.WriteLine("正常");
task1.Start();
task2.Start();
task3.Start();
task4.Start();
try
Task.WaitAll(task1, task2, task3, task4);
}
catch (AggregateException agex)
foreach (var ex in agex.InnerExceptions)
{
Console.WriteLine("異常内容是:{0}", ex.Message);
}
});
}
通過代碼,我們可以看到,我們隻需要使用try{ …}catch()來捕獲AggregateException異常,然後去處理其包含的異常即可.
方法2: AggregateException的Handle來處理每個異常.
AggregateException類型提供了一個Handle調用處理程式,以便我們對每個任務異常進行處理.代碼如下:
static void DealException()
Task task1 = new Task(() =>
try
agex.Flatten().Handle((ex) =>
if (ex is NotImplementedException)
{
Console.WriteLine("忽略");
return true;
}
else
Console.WriteLine("異常内容是:{0},已處理", ex.Message);
}
});
Console.ReadLine();
}
上面代碼中,捕獲到異常,通過AggregateException異常執行個體的Flatten()方法移除所有嵌套的 AggregateExceptions。處理程式傳回true表示異常被處理。傳回false則表示異常未被處理。
方法3:TaskScheduler.UnobservedTaskException 事件
當出錯的 Task 的未觀察到的異常将要觸發異常更新政策時發生,預設情況下,這将終止程序。它提供了最後一種手段處理所有未處理異常。通過處理這個事件,就不用終止應用程式,而用你自己的異常處理邏輯替代它。代碼如下:
TaskScheduler.UnobservedTaskException +=
(object sender, UnobservedTaskExceptionEventArgs eventArgs) =>
{
eventArgs.SetObserved();
eventArgs.Exception.Flatten().Handle(ex =>
{
Console.WriteLine("異常是:{0}", ex.Message);
return true;
});
};
throw new NullReferenceException();
{
throw new ArgumentOutOfRangeException();
task1.Start(); task2.Start();
while (!task1.IsCompleted || !task2.IsCompleted)
Thread.Sleep(500);
好,異常的處理介紹完畢。
本文轉自風車車 部落格園部落格,原文連結:http://www.cnblogs.com/xray2005/archive/2011/08/24/2151459.html,如需轉載請自行聯系原作者