天天看點

架構師速成6.14-開發架構-異常處理

異常為什麼需要單獨一節來講解呢?因為異常是軟體設計裡一項需要架構者自己構思處理的一個特殊部分。一般的架構沒有提供統一的處理方式,而且會被很多同學忘記處理,或者是比較粗糙處理掉。想一想有很多網站出錯時,使用者會看到一大段的英文異常,甚至執行的sql都包含在裡面,你會不會覺得很不專業呢?

首先異常應該分類,确定異常分類至關重要,這是後期進行不同處理的基礎:

業務異常,是使用者在執行業務請求時,出現的業務出錯或者不合法的資訊,該異常的出現是合理的,應該讓使用者看到異常提示的資訊,而且不需要記錄異常日志。

權限異常,是使用者在執行某些需要特殊權限的業務,或者未登入使用者操作需要登入相關的業務時,出現的異常,該異常出現是合理的,不需要記錄異常日志。但是處理方式是不同的。

系統異常,是出現一些不可預知的情況比如db當機,此類異常不應該出現,出現時需要記錄日志,而且此類異常需要及時報警,另外使用者不應該看到具體的錯誤資訊,此時應該提示比較優雅的錯誤資訊,比如:網站可能正在維護中,請稍候重試,如果重試失敗,請點選送出異常給相關人員,我們會及時處理。

這3類異常是所有異常的基礎類,當然系統比較龐大時,針對這3類異常還需要進行細分,以進行更精細化的處理。當然我們先不再展開,先就這3類異常如何處理展開讨論。

再說一下使用者請求的方式:

頁面跳轉

ajax請求+ajax跨域請求

針對每種請求方式都會有如下4種情況:

請求正常,正常傳回

請求出現業務異常,展示給使用者

請求出現權限異常,要求使用者登入或申請相關權限

請求出現系統異常,系統報警,給使用者提示,嘗試恢複

那如何進行異常的統一處理呢?

首先确認普通請求和ajax請求及ajax跨域請求,建議使用字尾進行區分json方式是ajax請求,如果是json方式而且包含callback參數的是跨域請求。

做一個統一的異常攔截器,先區分這3種方式,然後使用不同的handler來進行處理。

每個handler中,分别針對3中不同的異常,進行不同的處理邏輯。

頁面跳轉+業務異常,統一處理方式是跳轉到統一的業務提示界面,提示使用者對應的錯誤資訊,然後在頁面上可以選擇傳回上一頁。當然也可以讓使用者在controller的方法上标示自定義的錯誤處理方式@fail(“我希望跳轉到的頁面”),此時會将錯誤資訊放入上下文,在跳轉到的頁面進行展示。

頁面跳轉+權限異常,調到登入頁或權限申請頁

頁面跳轉+系統異常,跳轉到統一的錯誤頁面,觸發報警,但是不要在頁面展示錯誤的詳細資訊,使用者可以選擇傳回重試,或者 送出錯誤報告。

ajax+業務異常,這個最簡單了,直接提示錯誤資訊就ok了。

ajax+權限異常,根據不同類别進行頁面跳轉。

ajax+系統異常,觸發報警,但是不要在頁面展示錯誤的詳細資訊,使用者可以選擇重試,或者送出錯誤報告

跨域隻是需要增加callback,其他同ajax。

其中ajax,需要做統一的封裝,針對請求的不同錯誤進行處理,另外發送ajax請求,如果頁面重新整理終止時,注意捕獲ajax異常,不要提示出來了。

當然針對權限異常,我們還會再開專門的一節進行講解。

經過這樣的封裝之後,開發人員隻需要在需要的時候抛出異常就可以了。一個菜鳥程式員都可以輕松的抛出自己的異常,而無需關心異常背後到底發生了什麼。

另外如果系統複雜度增加時,可以增加異常的子類,進行不同的異常處理。另外系統異常也可以執行自動的補償機制,比如db當機,嘗試服務重新開機之類,呵呵,當然後期可以通過架構的方式盡量避免此類問題。