1. 程式人生 > >【SpringMVC】 4.2 異常處理

【SpringMVC】 4.2 異常處理

**SpringMVC學習記錄** > 注意:以下內容是學習 _**北京動力節點**_ 的SpringMVC視訊後所記錄的筆記、原始碼以及個人的理解等,記錄下來僅供學習 # 第4章 SpringMVC 核心技術 ## 4.2異常處理  SpringMVC框架處理異常的常用方式:使用@ExceptionHandler註解處理異常。 **異常處理步驟:** 1. 新建maven web專案 2. 加入依賴 3. 新建一個自定義異常類 MyUserException , 再定義它的子類NameException ,AgeException 4. 在controller丟擲NameException , AgeException 5. 建立一個普通類,作用全域性異常處理類 (1). 在類的上面加入@ControllerAdvice (2). 在類中定義方法,方法的上面加入@ExceptionHandler 6. 建立處理異常的檢視頁面 7. .建立springmvc的配置檔案 (1).元件掃描器 ,掃描@Controller註解 (2).元件掃描器,掃描@ControllerAdvice所在的包名 (3).宣告註解驅動 **專案結構:** ![](https://img2020.cnblogs.com/blog/2130787/202102/2130787-20210220234121298-1965551078.png) ### 4.2.1 @ExceptionHandler 註解  使用註解@ExceptionHandler可以將一個方法指定為異常處理方法。該註解只有一個可 選屬性value,為一個Class陣列,用於指定該註解的方法所要處理的異常類,即所要匹 配的異常。  而被註解的方法,其返回值可以是ModelAndView、String,或void,方法名隨意,方法 引數可以是 Exception 及其子類物件、HttpServletRequest、HttpServletResponse 等。系統會 自動為這些方法引數賦值。 對於異常處理註解的用法,也可以直接將異常處理方法註解於Controller之中。 ### (1) 自定義異常類  定義三個異常類:NameException、AgeException、MyUserException。其中 MyUserException 是另外兩個異常的父類。 MyUserException.java ```java package com.bjpowernode.exception; public class MyUserException extends Exception { public MyUserException() { super(); } public MyUserException(String message) { super(message); } } ``` AgeException.java ```java package com.bjpowernode.exception; //當年齡有問題時,丟擲的異常 public class AgeException extends MyUserException { public AgeException() { super(); } public AgeException(String message) { super(message); } } ``` NameException.java ```java package com.bjpowernode.exception; //表示當用戶的姓名有異常,丟擲NameException public class NameException extends MyUserException { public NameException() { super(); } public NameException(String message) { super(message); } } ``` ### (2) 修改 Controller 丟擲異常 MyController.java ```java package com.bjpowernode.controller; import com.bjpowernode.exception.AgeException; import com.bjpowernode.exception.MyUserException; import com.bjpowernode.exception.NameException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import javax.xml.ws.RequestWrapper; /** * @RequestMapping: * value : 所有請求地址的公共部分,叫做模組名稱 * 位置: 放在類的上面 */ @Controller public class MyController { @RequestMapping(value = "/some.do") public ModelAndView doSome(String name,Integer age) throws MyUserException { //處理some.do請求了。 相當於service呼叫處理完成了。 ModelAndView mv = new ModelAndView(); //try { //根據請求引數丟擲異常 if (!"zs".equals(name)) { throw new NameException("姓名不正確!!!"); } if (age == null || age > 80) { throw new AgeException("年齡比較大!!!"); } //}catch(Exception e){ // e.printStackTrace(); //} mv.addObject("myname",name); mv.addObject("myage",age); mv.setViewName("show"); return mv; } } ``` ### (3) 定義異常請求以及響應頁面 **請求頁面:** index.jsp ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <% String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/"; %>

處理異常的,全域性異常處理

姓名:
年齡:
``` **響應頁面** ageError.jsp ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> ageError.jsp
提示資訊:${msg}
系統異常訊息:${ex.message} ``` defaultError.jsp ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> defaultError.jsp
提示資訊:${msg}
系統異常訊息:${ex.message} ``` nameError.jsp ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> nameError.jsp
提示資訊:${msg}
系統異常訊息:${ex.message} ``` ### (4) 定義全域性異常處理類 不過,一般不這樣使用。而是將異常處理方法專門定義在一個類中,作為全域性的異常處理類。需要使用註解@ControllerAdvice,字面理解就是“控制器增強”,是給控制器物件增強功能的。使用@ControllerAdvice 修飾的類中可以使用@ExceptionHandler。當使用@RequestMapping 註解修飾的方法丟擲異常時,會執行@ControllerAdvice 修飾的類中的異常處理方法。==*@ControllerAdvice 是使用@Component 註解修飾的*==