一、前言
異常處理是每個系統必不可少的一個重要部分,它可以讓我們的程序在發生錯誤時友好地提示、記錄錯誤信息,更重要的是不破壞正常的數據和影響系統運行。異常處理應該是一個橫切點,所謂橫切點就是各個部分都會使用到它,無論是分層中的哪一個層,還是具體的哪個業務邏輯模塊,所關注的都是一樣的。所以,橫切關注點我們會統一在一個地方進行處理。無論是MVC還是WebForm都提供了這樣實現,讓我們可以集中處理異常。
在MVC中,在FilterConfig中,已經默認幫我們注冊了一個HandleErrorAttribute,這是一個過濾器,它繼承了FilterAttribute類和實現了IExceptionFilter接口。說到異常處理,馬上就會聯想到500錯誤頁面、記錄日志等,HandleErrorAttribute可以輕松的定制錯誤頁,默認就是Error頁面;而記錄日志我們也只需要繼承它,并替換它注冊到GlobalFilterCollection即可。關于HandleErrorAttribute很多人都知道怎么使用了,這里就不做介紹了。
ok,開始進入主題!在MVC中處理異常,相信開始很多人都是繼承HandleErrorAttribute,然后重寫OnException方法,加入自己的邏輯,例如將異常信息寫入日志文件等。當然,這并沒有任何不妥,但良好的設計應該是場景驅動的,是動態和可配置的。例如,在場景一種,我們希望ExceptionA顯示錯誤頁面A,而在場景二中,我們希望它顯示的是錯誤頁面B,這里的場景可能是跨項目了,也可能是在同一個系統的不同模塊。另外,異常也可能是分級別的,例如ExceptionA發生時,我們只需要簡單的恢復狀態,程序可以繼續運行,ExceptionB發生時,我們希望將它記錄到文件或者系統日志,而ExceptionC發生時,是個較嚴重的錯誤,我們希望程序發生郵件或者短信通知。簡單地說,不同的場景有不同的需求,而我們的程序需要更好的面對變化。當然,繼承HandleErrorAttribute也完全可以實現上面所說的,只不過這里我不打算去擴展它,而是重新編寫一個模塊,并且可以與原有的HandleErrorAttribute共同使用。
二、設計及實現
2.1 定義配置信息
從上面已經可以知道我們要做的事了,針對不同的異常,我們希望可以配置它的處理程序,錯誤頁等。如下一個配置:
<!--自定義異常配置--><settingException> <exceptions> <!--add優先級高于group--> <add exception="Exceptions.PasswordErrorException" view ="PasswordErrorView" handler="ExceptionHandlers.PasswordErrorExceptionHandler"/> <groups> <!--group可以配置一種異常的view和handler--> <group view="EmptyErrorView" handler="ExceptionHandlers.EmptyExceptionHandler"> <add exception="Exceptions.UserNameEmptyException"/> <add exception="Exceptions.EmailEmptyException"/> </group> </groups> </exceptions></settingException>
新聞熱點
疑難解答
圖片精選