MS Enterprise Library 6.0 (六) - 透過Attribute處理Exception

上一篇我們談過了AOP的概念以及如何透過attribute來實作類AOP的機制之後,你一定會想,要說Infrastructure Logic最容易跟Business夾雜在一起的情境,莫過於try…catch了,任何Business Logic中夾雜著try…catch,都很容易造成程式碼的過度相依,我們是否可以透過前面學習到的概念,利用Attribute來處理Exception呢?

我們看底下這段Code:

上面這段程式碼和上一篇我們介紹時的一樣,唯一的差別是第13行我們多加了一個ExceptionNotify的Attribute,這個Attribute會讓Calculate()這個Method發生Exception之後,自動將Ecception的狀態寫入LogFileName指定的log.txt檔。而無須把這樣寫log的程式碼用try…catch的方式寫在Calculate()這個Method當中…怎麼實現的呢?

我們看ExceptionNotify這個Attribute:

我們只需要繼承PolicyInjectionAttributeBase,建立一個自己的ExceptionNotify,並且override OnException(sender,e)這個Method,在其中進行我們想做的錯誤處理即可。

如此一來,當掛上該Attribute的Method發生Exception時,就會觸發你在OnException中寫的code,將Log儲存到LogFileName所指定的檔案位置了:

如此一來,就再也不需要把處理例外的程式碼雜亂的混入Business Logic程式碼中了,不失為降低相依性的一個好方法。

完整程式碼可以參考:
https://github.com/isdaviddong/isRock.Framework.AOP-Examples

-----------------
相關教育訓練: http://www.studyhost.tw/NewCourses/Architecture
若這篇文章對您有所幫助,請點選這裡加入FaceBook專頁按讚並追蹤,也歡迎您幫我們分享出去,謝謝您的支持。

留言

Unknown寫道…
Hi, David
非常感謝文章分享,非常實用
另外想請教三個問題

1.[Logging(LogFileName ="log.txt")]
其中log.txt有沒有辦法寫成變數
例如,\xxxLog\201711\20171130log.txt

2.如果是Azure上的專案,是否有辦法配合
System.Web.Hosting.HostingEnvironment.MapPath?

3.因私人行程衝突,未能參與201711的「團隊開發 與 架構設計 實務」
之後是否還有計劃開此課程? 非常感謝
isDavid寫道…
Hi hccga7,

問題1,2都是可以的,可參考底下連結的source code,修改52行的Save Log method配合你所要的需求即可:
https://github.com/isdaviddong/isRock.Framework.AOP-Examples/blob/master/ConsoleApp1/ConsoleApp1/Program.cs

明年第1季應該還會舉辦此課程,您可以參考底下連結:
http://www.studyhost.tw/NewCourses/Architecture

留下資料即可。
Norip.T表示…
老師您好,
WPF專案中使用MVVM,綁定COMMAND所呼叫的Method似乎無法ExceptionNotify。
得要直接呼叫該Method才會Notify到,請問是否哪邊觀念沒有釐清到呢?
isDavid寫道…
@Norip.T,

是的,因為我們控制不到WPF Component Event的行為,你會發現,之所以Attribute能用,是因為呼叫者看得懂該attribute,在上面的例子中,呼叫者都是我們自己寫的code,所以可行。

但在您提到的情境中,呼叫者是 .net 本身的框架,因此它不認得我們的attribute,因此不可行。

簡單的說,框架本身若沒有提供此功能,則attribute不會生效(但也不會造成額外的困擾或不相容的問題),但要怎麼讓框架支援這個功能呢? 那是另一個複雜的議題了...

這個網誌中的熱門文章

使用LM Studio輕鬆在本地端以API呼叫大語言模型(LLM)

VS Code的字體大小

使用 Dify 建立企業請假機器人

使用 Dify API 快速建立一個包含前後文記憶的對談機器人

使用C#開發LineBot(3) - 使用LineBotSDK發送Line訊息