1. 程式人生 > >springboot錯誤資訊返回與自定義異常處理

springboot錯誤資訊返回與自定義異常處理

在很多系統中,我們可能在執行時出現各種異常,有系統異常,程式碼異常,自定義的異常。這時候我們就要把這些錯誤異常資訊返回去給客戶端檢視才知道是哪裡出問題。這裡我們就說說spring boot的異常處理。

 

springboot錯誤資訊返回:

實際上,如果我們訪問一個url,不同的客戶端可能返回的資訊不一樣,比如瀏覽器返回錯誤頁面,手機客戶端返回json資料。

 

下面這段程式碼是springboot框架中丟擲一個異常,那麼springboot面對電腦瀏覽器和客戶端會做出什麼不同的返回資訊呢?

   
        @RequestMapping(value="/ones/{id:\\d+}",method=RequestMethod.GET)
        public User findByNumber2(@PathVariable(value="id")String number,@RequestHeader(name="User-Agent") String usergent) {
            throw new RuntimeException("錯誤了");
        }

訪問客戶端時(如手機app,這裡用postman模擬),返回的資訊是:

 

用瀏覽器訪問又會怎麼樣呢?

如上圖,返回了一個錯誤頁面。

 

總結:這是springboot預設的對這種restful服務的錯誤的處理。預設情況下,大多數可以這樣處理。但是有些情況下,預設的機制不符合我們對錯誤資訊的處理。那麼我們該怎麼自定義這些錯誤處理的行為。

 

(1)例如我們訪問一個本url下不存在的路徑,那麼返回的資訊由我們自定義。

第一步:在src/main/resources資料夾下建立一個資料夾,叫做resources,然後再在這個新資料夾下建立一個資料夾叫error.

在這個error資料夾下,我們可以寫一些html,即自定義的錯誤頁面。如404.html,500.html.

然後用瀏覽器訪問一個不存在的路徑時,就會出現這個自定義的404.html頁面。

這種配置下,用客戶端訪問時仍然出現json資料,而不是錯誤頁:

 

所以,自定義的錯誤html只對瀏覽器產生影響,對客戶端app仍然返回json

 

 

(2)對於客戶端app訪問時只返回json錯誤資訊,我們從上圖得知,預設情況下,springboot只會把message資訊返回去,所以這種情況下我們得自定義一些異常。

第一步,首先定義一個類,這個類是全域性異常處理類,

如上圖,@ControllerAdvice這個註解將這個類作為全域性異常處理類,@ExceptionHandler註解裡面是自定義異常類,當丟擲這個異常時,這個方法就會處理異常,@ResponseStatus註解代表返回給前端的狀態碼。一般都是用Map<String,Object>做返回值,用來放錯誤資訊,key是引數,value是錯誤資訊。返回例子如下:

 

所以,這時候異常就是按照我們的設定來返回。