日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot实战 之 异常处理篇

發布時間:2023/12/20 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot实战 之 异常处理篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在互聯網時代,我們所開發的應用大多是直面用戶的,程序中的任何一點小疏忽都可能導致用戶的流失,而程序出現異常往往又是不可避免的,那該如何減少程序異常對用戶體驗的影響呢?其實方法很簡單,對異常進行捕獲,然后給予相應的處理即可。但實現的方式卻有好多種,例如:

try {... } catch (Exception e) {doSomeThing(); }

像這種標準的 try-catch 是可以解決問題,但如果讓你在每個接口實現里面都 try-catch 一下,我想你應該是不太愿意的。那么下面來介紹下 SpringBoot 為我們提供的處理方式。

1. ErrorController 應用

首先,我們來模擬一下,出現異常的場景,方式比較簡單,直接在正常的代碼里面拋出一個異常即可。

在上面的示例中,調用接口時,出現了異常,但客戶端卻收到一個相對正常的響應,這是因為 SpringBoot 默認提供了一個 /error 的映射,該映射被注冊為 Servlet 容器中的一個全局錯誤頁面用來合理處理所有的異常情況。但示例中的響應報文不符合我們定義的數據規范,想要使其滿足自己的數據規范,可以自己定義一個新的 ErrorController,代碼如下:

@Controller @RequestMapping("${server.error.path:${error.path:/error}}") public class FundaErrorController implements ErrorController {@Overridepublic String getErrorPath() {return "/error";}@RequestMapping@ResponseBodypublic Result doHandleError() {return new Result(ResultCode.WEAK_NET_WORK);} }

當我們再次訪問該接口的時候會返回:

{"code": -1,"msg": "網絡異常,請稍后重試","data": null }

2. ExceptionHandler 應用

熟悉 SpringMVC 的人應該都知道 @ExceptionHandler 這個注解,在 SpringBoot 里面,我們同樣可以使用它來做異常捕獲。

2.1. 單一 Controller 異常處理

這種方式使用場景較少,但作為學習 @ExceptionHandler 入門示例還是非常不錯的,直接在對應的 Controller 里面增加一個異常處理的方法,并使用 @ExceptionHandler 標識它即可。

@ExceptionHandler(Exception.class) public Result handleException() {return new Result(ResultCode.WEAK_NET_WORK); }

客戶端得到的效果與使用 ErrorController 完全一致,但對于服務端來說卻不太一樣,如果仔細觀察這兩種方式的日志輸出的話,會發現使用 ErrorController 時,后臺會打印出異常堆棧信息,而使用 @ExceptionHandler 卻不會,這是因為這兩種處理方式的流程存在著本質的差別。

  • ErrorController:?調用 UserController 拋出異常時,自身沒有做任何處理,所以會打印出堆棧信息,但這個異常會被 Servlet 容器捕捉到,Servlet 容器再將請求轉發給注冊好的異常處理映射 /error 做處理,客戶端收到的實際是 ErrorController 的處理結果,而不是 UserController 的。

  • ExceptionHandler:?異常的處理方法直接被定義在 UserController 里面,也就是說,在異常拋出的時候,UserController 會使用自己的方法去做異常處理,而不會拋出給 Servlet 容器,所以這個地方沒有打印堆棧信息。

  • 如果想要在后臺添加堆棧信息的輸出也非常簡單,只需要將該異常作為一個參數傳遞給異常處理方法,然后在處理方法里面做相應的操作即可。

    @ExceptionHandler(Exception.class) public Result handleException(Exception e) {e.printStackTrace();return new Result(ResultCode.WEAK_NET_WORK); }

    2.2. 父級 Controller 異常處理

    項目的往往存在著多個 Controller,而它們在異常處理方面有存在著很多的共性,這樣就不太適合在每一個 Controller 里面都編寫一個對應的異常處理方法。可以將異常處理方法向上挪移到父類中,然后所有的 Controller 統一繼承父類即可。

    定義父類 BaseController:

    public class BaseController {@ExceptionHandler(Exception.class)public Result handleException(Exception e) {e.printStackTrace();return new Result(ResultCode.WEAK_NET_WORK);}}

    ?

    UserController 通過繼承 BaseController 完成異常處理:

    @RestController @RequestMapping("/sys/user") public class UserController extends BaseController {... }

    2.3. Advice 異常處理

    對于使用父級 Controller 完成異常處理也有著它自己的缺點,那就是代碼耦合嚴重,一旦哪天忘記繼承 BaseController,異常又會直達客戶了。想要解除這種耦合關系,可以使用 @ControllerAdvice 來協助處理。

    @ControllerAdvice @ResponseBody public class ExceptionHandlerAdvice {@ExceptionHandler(Exception.class)public Result handleException(Exception e) {e.printStackTrace();return new Result(ResultCode.WEAK_NET_WORK);}}

    3. 多類別異常處理

    實際的開發場景中,異常是區分很多類別的,不同類別的異常需要給用戶不同的反饋。例如,在?SpringBoot實戰 之 數據交互篇?中有使用到注解式參數校驗,但校驗不通過原因并沒有以有效的方式告之給前端應用。下面我們通過上面提到的異常處理方式來完成這個功能:

    首先,在 ResultCode 類中定義好 參數錯誤 的 code,代碼如下:

    PARAMETER_ERROR(10101, "參數錯誤")

    在 ExceptionHandlerAdvice 中添加對應的異常處理方法:

    @ExceptionHandler(MethodArgumentNotValidException.class) public Result handleIllegalParamException(MethodArgumentNotValidException e) {List<ObjectError> errors = e.getBindingResult().getAllErrors();String tips = "參數不合法";if (errors.size() > 0) {tips = errors.get(0).getDefaultMessage();}Result result = new Result(ResultCode.PARAMETER_ERROR);result.setMsg(tips);return result; }

      

    當應用程序拋出 MethodArgumentNotValidException 時,會精確匹配到該方法,在方法里面會獲取到校驗結果,并將所有校驗錯誤中的第一條返回給前端應用。

    這樣的話,就可以在 ExceptionHandlerAdvice 里面添加各種各樣的異常處理方法,以適合不同的應用場景。

    項目的 github 地址:https://github.com/qchery/funda

    ?

    原文鏈接:http://blog.csdn.net/chinrui/article/details/71036544

    轉載于:https://www.cnblogs.com/Terry-Wu/p/8343289.html

    總結

    以上是生活随笔為你收集整理的SpringBoot实战 之 异常处理篇的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: av网站在线免费观看 | 日韩欧美毛片 | 成全世界免费高清观看 | 天堂√8在线中文 | 少妇久久精品 | 久久久久久久久久久久Av | 依人在线视频 | 最近中文字幕免费视频 | 在线sese| 男男play视频 | 亚洲区精品 | а中文在线天堂 | 久久精品夜色噜噜亚洲a∨ 中文字幕av网 | 一区二区三区黄色片 | 欧美激情国产一区 | 影音先锋国产在线 | 久草天堂| 浓精喷进老师黑色丝袜在线观看 | 国产成年无码久久久久毛片 | 欧美xxxx18国产 | 影音先锋成人资源站 | 麻豆一区产品精品蜜桃的特点 | 国产av无码专区亚洲a∨毛片 | 亚洲欧美日韩在线看 | 久久精品欧美日韩 | 久久婷婷国产麻豆91天堂 | 亚洲熟妇无码一区二区三区导航 | 亚洲无圣光| 日韩女同互慰一区二区 | 侵犯女教师一区二区三区 | 欧美特黄视频 | 亚洲国产精华液网站w | 香蕉视频网站在线观看 | 丰满岳跪趴高撅肥臀尤物在线观看 | 午夜小网站 | 99艹| 国产女上位 | 日韩精品欧美激情 | 国产网友自拍视频 | 国产一区黄| 91视频精选 | 男人天堂综合 | 婷婷五月综合激情 | 成人欧美视频在线观看 | jizz欧美大全 | 激情导航 | 国产东北真实交换多p免视频 | 国产精品久久久久久久久久久久 | 成人看 | 亚洲国产欧美在线人成 | 99成人在线| 成人宗合网 | 亚洲视频一区二区 | 美女精品一区 | 成人免费毛片足控 | 超碰资源 | 国产精品一级片 | 成人午夜性视频 | 777精品伊人久久久久大香线蕉 | 情涩快播| 丁香婷婷六月天 | 爆操91| av手机免费在线观看 | 黑人精品一区二区 | 日本老肥婆bbbwbbbwzr | 日韩激情在线播放 | www.99色 | 夜夜操网| 国产区精品在线观看 | 成人福利视频在线观看 | 久久网一区 | 久久99久久99精品免观看粉嫩 | 国产99久一区二区三区a片 | 欧美性潮喷xxxxx免费视频看 | 美女视频黄色免费 | 在线黄网 | 色丁香久久 | 中文无码熟妇人妻av在线 | 爱爱视频天天干 | 中文字幕视频免费 | 在线观看网站污 | 男人靠女人免费视频网站 | www黄在线观看 | 免费看一级一片 | 日本xx视频| 日韩性色| 72种无遮挡啪啪的姿势 | 国产女教师一区二区三区 | 69精品视频| 操人在线观看 | 福利视频导航网 | 很很干很很日 | 五月开心播播网 | 久久久午夜| 欧美在线视频一区二区三区 | 亚洲成年人 | www.国产成人 | jzzijzzij日本成熟少妇 | 色涩涩 |