02.02 使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面

在互聯網時代,不管是面向廣大用戶的應用、WEB,還是公司內部管理系統,如果有了異常,而沒有正確的去處理,那麼出現的500服務器錯誤,那是非常不友好的,不友好的出現異常錯誤,都會可能導致用戶的流失,程序中的bug導致的服務器錯誤是不可避免的,那麼我們就要統一捕獲這些異常來給用戶展現友好的界面來提高用戶體驗,今天就來介紹一下SpringBoot的異常處理方式!


使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面

啟動一個簡單的SpringBoot應用,正常訪問一下:


使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面


使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面

如果在這個方法中插入一段異常代碼,會發生什麼事情呢?


使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面


使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面

出現上面的異常錯誤頁面,對於用戶來說是很不友好的,對於你的領導來說,你是致命的,那麼我們就要統一的捕獲這些異常,來給用戶展示比較友好的界面,不要因為咱們的失誤來導致用戶流失,就像春運時到12306網站去搶票,明明網絡狀況良好,而它的系統承受能力達不到,它還是會給你統一恢復:當前網絡狀況不好。

對於異常處理,我們可以在對應的方法中捕獲異常,然後進行異常處理,但是這樣每一個方法都這樣捕獲異常進行處理,從代碼整潔度來看是不可取的,對於這種處理方式也會讓工作顯得繁重。而SpringBoot開發利器就提供了這樣的註解,來統一處理異常,這個註解就是@ExceptionHandler,我這裡就不用漂亮的頁面作為異常捕獲展示,就用字符串作為展示捕獲異常處理頁面。

在需要捕獲異常的Controller中加入如下代碼,那麼訪問異常的URL就會出現友好的提示:


使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面


註解@ExceptionHandler用來註解處理異常的方法,value屬性表示處理的異常類型,如果在一個Controller中有一個用@ExceptionHandler修飾的方法,當Controller的任何一個方法拋出異常時,都會由@ExceptionHandler註解修飾的方法處理異常,而不會拋給servlet容器。

注意,上面說的時在一個Controller中,那麼在另外的一個Controller中有了異常,會捕獲嗎?


使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面


使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面

可以看出,通過@ExceptionHandler註解修飾的方法處理異常,只在當前Controller中生效,廣大的碼友同志們都會腦洞大開,會給出一個方案,那就是寫一個父類,在父類中寫捕獲異常的方法,然後子類繼承父類,那麼所有的子類都會有處理異常的能力了,這樣不失為一個好辦法,但如果忘了繼承父類,那麼也會出現不友好的異常頁面,不用著急,不用氣餒,SpringBoot也為我們提供這樣機制,來統一處理異常。


使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面

那就是配合使用註解@ControllerAdvice,@ControllerAdvice註解的類就是當前項目中所有類的統一異常處理類,@ExceptionHandler註解的方法用來定義函數針對異常類型以及異常如何處理,不用在每個Controller中逐一定義異常處理方法了。代碼示例如下:


使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面

這樣不用在其他Controller中定義了,訪問如下:


使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面


使用SpringBoot的統一異常處理,不用擔心bug造成的異常信息頁面

這樣做異常處理,再也不用擔心出來不友好的異常信息了!整個人的心情都變好了!


分享到:


相關文章: