1. 程式人生 > >JAVA 後臺全域性異常控制

JAVA 後臺全域性異常控制

一、為什麼要進行異常控制

為什麼要進行異常控制,在我們開發中,異常是最常見的問題,也是最不願意看見的問題。但是我們也不得不看見,利用好異常能使我們快速成長,也能讓開發人員快速定位異常,設計好了異常控制,能控制到這個異常是由誰產生的,何時產生的,產生的資料是什麼,異常的方法是哪個,異常資訊是什麼等等,當我們利用好這些異常資訊和資料,能讓我們在開發過程中節約一部分時間和找問題的時間。

二、異常重現

例子1:我們在開發過程中,開發完成,對接也完成了,有一些異常還是會出來,而且這種異常是不定出現,可能這次操作出現異常,下次一樣的操作就不會出現異常,這種異常在我們進行對接除錯的時候非常麻煩,除錯這個異常需要花費很長的時間。

例子2:我們在進行開發的時候,我們在進行對接除錯的時候,日誌會滾動很快,即使有異常也很難定位到異常資訊位置,這樣就會導致開發人員在定位異常上面花費時間,重新去點選這個異常出現,進行除錯,這樣也很花費時間。

例子3:當應用進行上線後,測試很科學,也沒有發現任何異常,但是有的異常很奇怪,莫明的出現,這個時候我們就得去翻日誌,在最開始的時候日誌系統會全盤開著,每天可能就是多少個G的日誌,要從中去找異常那猶如就是大海撈針,費神又費力。

有了這個異常控制以後,我們就可以在異常裡面快速定位這個異常,異常的引數是什麼,異常的異常資訊是什麼,如果根據異常資訊讀取找出問題所在方法和行數,如果實在找不出來,直接進行異常引數自我驗證,找出異常原因,從而進行異常重現。

三、實現原理

1、整合spring實現異常攔截

         實現spring的介面HandlerExceptionResolver重寫resolveException該方法,配置bean為<bean id="exceptionResolver" class="com.xxx.xxx.xxExceptionHandler"/>,如果採用註解,直接在類xxExceptionHandler註解@Component即可。該方法提供了幾個引數,引數為:

(一)HttpServletRequest物件代表客戶端的請求,當客戶端通過HTTP協議訪問伺服器時,HTTP請求頭中的所有資訊都封裝在這個物件中,通過這個物件提供的方法,可以獲得客戶端請求的所有資訊

(二)HttpServletResponse物件代表伺服器的響應。這個物件中封裝了向客戶端傳送資料、傳送響應頭,傳送響應狀態碼的方法。檢視HttpServletResponse的API,可以看到這些相關的方法。

(三)Object物件包含了該請求的方法所有資訊,通過這個物件提供的方法,可以獲取到請求的控制器和方法。

(四)Exception物件包含了該請求的異常資訊,通過這個物件可以獲取到異常資訊。

2、資訊提取

在這一步非常的重要,資料提取好了可以直接定位異常,所以下一步說明資料提取。

(一)獲取請求連結:

String url = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getServletPath();

(二)獲取伺服器IP

String serviceIp = request.getLocalAddr();

(三)獲取客戶端IP

String clientIp = request.getRemoteAddr();

(四)獲取請求型別

String httpMethod = request.getScheme();

(五)獲取字符集

String charEncoding = request.getCharacterEncoding();

(六)獲取請求引數

Map<String, String[]> parameters = request.getParameterMap();

引數可以後期加工,是用JSON呢還是拼接成請求連結呢,都是可以的。

(七)獲取異常控制器+方法

前面所提的引數第三點,Object就是請求異常的控制器和方法,可以強轉為HandlerMethod獲取更多資訊,例如獲取到只有控制器完整結果,但是獲取到的結果和直接Object沒得多大區別,都能定位到方法去。

(八)獲取異常資訊

前面所提引數Exception就是異常資訊,直接使用就可以了,這個裡面包含了異常完整資訊。

3異常重現方式

這些異常儲存到資料庫,在進行一些手段控制,直接定位該異常是某個開發人員,開發人員解決沒有,解決的時間是多久,等等....。

可以做一個後臺異常資訊管理,檢視異常資訊,如果異常資訊中查看不出來問題,可以直接瀏覽器模擬傳送請求,進行異常重現除錯,這樣非常快捷,為開發人員節省異常除錯時間。可能在前期做這個異常管理期間會消耗一部分時間,總的來說做了這個異常管理,方便快捷舒適。