<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
程式的異常:Throwable
嚴重錯誤問題:Error 我們不處理。這種問題一般都是很嚴重的,我們一般處理不了,比如說記憶體溢位。
問題:Exception
1.執行期問題:RuntimeException 這種問題我們也不處理,因為是你寫程式碼的問題,而且這個問題的出現肯定是我們的程式碼不夠嚴謹,需要修正程式碼的。
2.編譯期問題:不是RuntimeException的異常 必須進行處理的,因為你不處理,編譯就不能通過。
如果程式出現了問題,我們沒有做任何處理,最終JVM會做出預設的處理。
1.把異常的名稱、原因及出現的位置等資訊輸出在控制檯。
2.同時會結束程式。
(但是呢,其餘沒有問題的程式就不能繼續執行了)
所以感覺JVM的預設處理不夠好,既然不好那我們就自己來處理唄。
SpringBoot預設的例外處理機制:springboot預設提供了一套處理異常的機制。一旦程式出現了異常,SpringBoot會向/error的url傳送請求。在springboot中提供了一個叫BasicErrorController 來處理/error 請求,然後跳轉到預設顯示異常的頁面來展示異常資訊。
如 果 我 們 需 要 將 所 有 的 異 常 統一 跳 轉 到 自 定 義 的 錯 誤 頁 面 , 需 要 再
src/main/resources/templates 目錄下建立 error.html 頁面。注意:名稱必須叫 error
還可以在src/main/resources/templates/error目錄下編寫狀態碼.html檔案,會預設先從這裡找,找不到再找src/main/resources/templates下的error.html
上一種方法不管發生什麼異常,都只能跳轉到一個頁面,顆粒度太大,這一種方式可以實現對不同的異常做不同的處理。
@RequestMapping @Controller public class ExceptionController { @PostMapping("/exception") public String hello(){ //int i = 1/0; return "index"; } /** * 該方法返回ModelAndView:目的是為了可以讓我們封裝檢視和錯誤資訊 * @param e 引數 Exception e:會將產生異常物件注入到方法中 * @return */ @ExceptionHandler(value = {java.lang.ArithmeticException.class}) public ModelAndView arithmeticExceptionHandler(Exception e){ ModelAndView mv = new ModelAndView(); mv.addObject("errorMsg",e); mv.setViewName("error"); return mv; } }
優點:可以自定義儲存異常資訊的key,和跳轉檢視的名稱。
缺點:需要編寫大量的異常方法,不能跨controller,如果兩個controller中出現同樣的異常,需要重新編寫例外處理方法。
上一種方式必須要在每一個Controler裡面重複寫例外處理程式碼,程式碼複用性太差,這一種方法可以實現異常的全域性處理。需要建立一個能夠處理異常的全域性異常類。在該類上需要新增@ControllerAdvice 註解
/** * 全域性例外處理類 */ @ControllerAdvice public class GlobalController { /** * 該方法返回ModelAndView:目的是為了可以讓我們封裝檢視和錯誤資訊 * @param e 引數 Exception e:會將產生異常物件注入到方法中 * @return */ //攔截的異常可以寫Exception @ExceptionHandler(value = {java.lang.ArithmeticException.class}) public ModelAndView arithmeticExceptionHandler(Exception e){ ModelAndView mv = new ModelAndView(); mv.addObject("errorMsg",e+"controllerAdvice"); mv.setViewName("error"); return mv; } }
缺點:編寫大量的例外處理方法,程式碼冗餘。
上一種方式,每處理一種異常就要寫一個處理方法,如果有很多異常需要處理,寫起來會很麻煩,這一種方式可以很好的解決這種問題,需要在全域性異常類中新增一個方法完成異常的統一處理。
/** * 通過 SimpleMappingExceptionResolver 做全域性例外處理 */ @Configuration public class GlobalException { /** * 該方法必須要有返回值。返回值型別必須是: SimpleMappingExceptionResolver * @return */ @Bean public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){ SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver(); Properties prop = new Properties(); //引數1:異常的全類名 引數2:檢視的名字 prop.setProperty("java.lang.ArithmeticException","error"); prop.setProperty("java.lang.NullPointerException","error"); //設定異常與檢視的對映資訊 resolver.setExceptionMappings(prop); return resolver; } }
缺點:不顯示具體異常資訊
上一種方式不能在跳轉頁面的同時攜帶異常資訊,這樣不利於排錯,當前這種方式可以解決上述問題,我們需 要 在全域性例外處理類中實現HandlerExceptionResolver 介面。
/** * 通過實現 HandlerExceptionResolver 介面做全域性例外處理 */ @Configuration public class GlobalException implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView mv = new ModelAndView(); //判斷不同的異常型別跳轉不同檢視 if(ex instanceof ArithmeticException){ mv.setViewName("error"); } if(ex instanceof NullPointerException){ mv.setViewName("error"); } mv.addObject("errorMsg",ex.toString()); return mv; } }
public enum ExceptionEnum { //列舉常數 PRICE_CANNOT_BE_NULL(500,"商品價格不能為空"), ; private int code; //狀態碼 private String msg; //異常資訊 ExceptionEnum() { } ExceptionEnum(int code, String msg) { this.code = code; this.msg = msg; } public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
/** * 自定義異常類,繼承RuntimeException */ public class MyException extends RuntimeException{ private ExceptionEnum exceptionEnum; public MyException() { } public MyException(ExceptionEnum exceptionEnum) { this.exceptionEnum = exceptionEnum; } public ExceptionEnum getExceptionEnum() { return exceptionEnum; } public void setExceptionEnum(ExceptionEnum exceptionEnum) { this.exceptionEnum = exceptionEnum; } @Override public String toString() { return "MyException{" + "exceptionEnum=" + exceptionEnum + '}'; } }
/** * 自定義異常結果處理類 */ public class ResultException { private Integer statusCode; //狀態碼 private String message; //異常資訊 private Long timeStamp; //時間戳 public ResultException() { } public ResultException(ExceptionEnum em){ this.statusCode = em.getCode(); this.message = em.getMsg(); this.timeStamp = System.currentTimeMillis(); } public Integer getStatusCode() { return statusCode; } public void setStatusCode(Integer statusCode) { this.statusCode = statusCode; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public Long getTimeStamp() { return timeStamp; } public void setTimeStamp(Long timeStamp) { this.timeStamp = timeStamp; } @Override public String toString() { return "ResultException{" + "statusCode=" + statusCode + ", message='" + message + ''' + ", timeStamp=" + timeStamp + '}'; } }
/** * @ControllerAdvice + @ExceptionHandler +自定義異常 來做全域性例外處理 */ @ControllerAdvice public class GlobalException { /** * 攔截自定義異常MyException * @param e * @return */ // @ExceptionHandler(MyException.class) // public @ResponseBody ResultException handlerRuntimeException(MyException e){ // ExceptionEnum exceptionEnum = e.getExceptionEnum(); // ResultException res = new ResultException(exceptionEnum); //
到此這篇關於springboot處理異常的5種方式的文章就介紹到這了,更多相關springboot處理異常內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45