天天看點

多核時代 .NET Framework 4 中的并行程式設計4---異常處理

任何程式都避免異常情況發生.那麼如何在發生異常情況時,很好的處理掉異常,以便是我們的程式繼續良好的運作呢?那麼介紹幾種處理.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,如需轉載請自行聯系原作者

繼續閱讀