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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

从零开始学 Java - Spring MVC 统一异常处理

發布時間:2024/4/17 java 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零开始学 Java - Spring MVC 统一异常处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

看到 Exception 這個單詞都心慌

如果有一天你發現好久沒有看到Exception這個單詞了,那你會不會想念她?我是不會的。她如女孩一樣的令人心動又心慌,又或者你已經練功到了孤獨求敗,等了半輩子終于看到了她,這時候你的小弟準備沖上去解決它說:大哥,我來解決它。你擺擺手說:還是我來最后一次吧...

從此,你再也沒看到過Exception了。

異常是個好東西

做開發的對異常在熟悉不過了,幾乎是天天打交道的。記得當年寫代碼的時候記住的第一個異常是未將對象引用設置到對象的實例,現在想想已經好久沒有看到他了,當然這是 .Net 下的一個異常,對應 Java 下的是java.lang.NullPointerException。

其實,異常并不可怕,可怕的是你不知道怎么解決它。?解決異常的方式有很多種,比如寫好每一行代碼,保證不出任何邏輯錯誤,就可以從根本上解決問題,但是,沒有一個程序員能保證自己的代碼不報異常,這也就是為什么會有?Bug?這個令人討厭的東西了。當然,如果我們寫的代碼都沒有異常,不出 Bug ,那怎么讓我們有和測試妹子在一起工作的機會呢!哈哈哈...

既然我們保證不了從根本上解決代碼不出異常的情況,那我們是誰阿,我們為了在測試妹子面前展示厲害到無敵的敲代碼能力,我們就偷偷的在業務代碼里使用?try...catch...?來讓她看不出你寫代碼能力不行,你這時候就厲害到不行了,你脈脈看著她,她看著你...

難道不應該有即使我們不使用?try...catch...?也能捕獲寫出來的異常么?

這里有一本《異常秘籍》

并不是說使用?try...catch...?不行,是因為在程序里可能會有你可預知的異常,這時候你當然會去使用它來捕獲異常,但是如果在一個你不可預知的方法里,你本能認為它不會出異常,你還會使用?try...catch...?去捕獲么?如果你回答會,那我問你:你意思就是在每一個方法里加入?try...catch...?代碼了?

當然,這樣并不是不行,是不太好。你想想,這樣寫起來是不是也太累了,我們都很懶的,而且我們程序里有一個講究是「耦合性」,那你這就完全不符合「高內聚、低耦合」咯?簡單說,異常的處理對業務代碼的侵入性太強了,不夠美,我們當然有更好的處理方式了。

我們可不可以統一處理異常呢? 當然可以啦!

現在就新建一個ExceptionHandler.java異常處理類。

@Component public class ExceptionHandler implements HandlerExceptionResolver {private static Logger log = Logger.getLogger(ExceptionHandler.class);@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) {log.error("ExceptionHandler 捕獲的異常:", exception);String requestType = request.getHeader("X-Requested-With");String type = "api"; //TODO:if (!type.equals("api") && StrUtil.isNullOrEmpty(requestType)) {// 非API請求return new ModelAndView("redirect:/500.html");} else {// JSON格式返回Map<String, Object> responseMap = new HashMap<String, Object>();responseMap.put("code", -1);responseMap.put("msg", "系統異常,請稍后重試!");String json = new Gson().toJson(responseMap);response.setCharacterEncoding("UTF-8");response.setContentType("application/json; charset=utf-8");try {response.getWriter().write(json);response.getWriter().flush();return null;} catch (IOException e) {log.error("", e);}}return new ModelAndView("redirect:/500.html");} }

好,就這樣簡單,完成了異常的統一處理。其實是 Spring 中定義的?HandlerExceptionResolver?接口,我們重寫里邊的?resolveException?方法就可以捕獲項目中未處理的異常。當然,這就要求我們項目中的異常要一層一層的拋出去了,這時候不要擔心,我們會最終捕獲它的。

現在簡單說說上邊我的捕獲代碼的處理方式,首先,我捕獲到異常就寫一個 log 記錄它,以便于我們找出查看,然后,如果是我們的 API 接口請求的話,我就返回接口的統一 Json 格式,如果是其他請求的話,我就會返回到一個 500 的錯誤頁面,以優雅的方式提示用戶。

怎么使用

其實,完全就不用說怎么使用了,非常簡單的用法,mafly.那這里我就試著拋一個異常出去,然后故意不捕獲它,看看結果到底會怎樣?
1.先在 ServiceImp 層拋一個異常。

2.在 Controller 層調用這個方法。

3.請求一個 API 接口。

這時候,你看控制臺打印出來了異常日志,就是我們剛剛拋出來的,你也可以調試一下,看看執行過程。這個時候,你就可以隨心所欲的統一處理異常了。
文章的具體的案例,都可以訪問我的 Github 看到?https://github.com/mafly/SpringDemo

轉載于:https://www.cnblogs.com/xieyulin/p/7070300.html

總結

以上是生活随笔為你收集整理的从零开始学 Java - Spring MVC 统一异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。

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