【SpringMVC】 4.2 異常處理
阿新 • • 發佈:2021-02-21
**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 註解修飾的*==
處理異常的,全域性異常處理
姓名:年齡:
``` **響應頁面** 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 註解修飾的*==