天天看點

堅持學習WF(24):WF中的異常處理

<a href="http://www.cnblogs.com/carysun/archive/2008/05/29/WF.html">[置頂]堅持學習WF文章索引</a>

對于C#程式中抛出的異常我們可以使用try-catch來捕獲并處理。在WF中的對異常的處理和C#中也比較相似,不過有一些不同,主要有以下幾點:

1. WF中一個未處理的異常僅僅會讓目前的工作流執行個體終止而不會導緻整個應用程式終止,并且會觸發WorkflowRuntime的WorkflowTerminated事件。 

2. WF中的異常處理是異步的,是以WF可以将未處理的異常放在内部隊列中等待處理。 

3. WF中的異常可以使用代碼方式處理,也可以在WF模型中處理。我們使用FaultHandlerActivity活動,該活動就像C#中的catch語句一樣,每個FaultHandlerActivity活動對應一個異常類型,該活動為複合活動,我們可以添加子活動來編寫自己的邏輯處理程式.

如果在一個工作流中發生異常,他會先檢查自身有沒有捕獲異常,如有沒有會檢查他的父活動有沒有捕獲,如果直到工作流的根活動都沒有捕獲異常,那麼整個工作流就終止了,這時會引發WorkflowRuntime的WorkflowTerminated事件。

未處理的異常

1.我們下面舉例來說明,首先我們建立一個順序工作流控制台項目CaryExceptionDemo,建立一個順序型工作流ExWorkflow,我們放兩個CodeActivity.在CodeActivity1中我們根據workflow傳入的參數抛出兩個異常。具體代碼如下:

---開始執行第一個工作流--- 

工作流終止:DivideByZeroError 

---第一個工作流執行結束---

---開始執行第二個工作流--- 

工作流終止:ArithmeticError 

---第二個工作流執行結束--- 

請按任意鍵繼續. . .

使用FaultHandlerActivity捕獲異常

1.我們下面捕獲并處理CodeActivity1抛出的兩個異常,我們在工作流的錯誤處理試圖中使用FaultHandlerActivity活動來捕獲異常,如下圖所示:

堅持學習WF(24):WF中的異常處理

2.我們在faultHandlersActivity1中拖入兩個FaultHandlerActivity活動,将他們的FaultType屬性分别設定為System.DivideByZeroException和System.ArithmeticException,這裡有一點要注意那就是這兩個活動的左右次序不能反了,處理DivideByZeroException一定要在左邊,這就像我們C#中的Catch一樣先處理特定的異常,在處理一般的異常。在FaultHandlerActivity的中我們放我們自己的處理異常代碼,如下:

<a href="http://11011.net/software/vspaste"></a>

運作該工作流得到如下結果:

處理除0異常: 除0異常 

處理算術異常: 算術異常 

在活動中捕獲異常

我們從上面的結果中發現工作流中CodeActivity2依然沒有執行,這主要是因為當異常發生的時候會自動尋找合适的FaultHandlerActivity來處理,由于我們在工作流級别捕獲的異常自然CodeActivity2就沒有執行,有點時候這不是我們想要的結果,如何來達到我們的目的呢,其實很簡單,我們讓CodeActivity1在一個容器中執行,我們使用該容器的錯誤處理試圖來捕獲異常并處理,在WF中隻有實作的Activity元件,才有FaultHandlersActivity異常捕獲容器。SequenceActivity就可以實作,工作流設計如下圖:

堅持學習WF(24):WF中的異常處理

在sequenceActivity1的錯誤處理視圖中我們隻需要将原來放在工作流錯誤處理視圖中的兩個FaultHandlerActivity剪切過來就可以了。現在我們運作程式得到結果如下:

第二個CodeActivity執行了 

從結果中我們可以CodeActivity2活動執行了。這些是WF中關于異常處理的一些知識。

本文轉自生魚片部落格園部落格,原文連結:http://www.cnblogs.com/carysun/archive/2008/10/18/WFException.html,如需轉載請自行聯系原作者