文章目录
- 1 统一异常处理介绍
- 2 统一异常处理案例
1 统一异常处理介绍
在实际项目中,不可避免需要处理各种异常。如果每个都单独处理,代码中则会出现大量的try {...} catch {...} finally {...}
代码块,不仅有大量的冗余代码,而且还影响代码的可读性。
Spring从3.2版本开始增加了一个注解@ControllerAdvice
,它可以与@ExceptionHandler
、@InitBinder
、@ModelAttribute
等注解配套使用,可以统一进行异常处理。
2 统一异常处理案例
- 1)创建maven工程
exception-demo
,并配置其pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.itweid</groupId>
<artifactId>exception-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
</project>
- 2)创建
UserController
类,在其getLoginUser
方法中模拟异常
package com.itweid.exception.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/user")
public class UserController {
// 获取当前登录用户信息
@GetMapping("/getLoginUser")
public String getLoginUser() {
// 模拟异常
int i = 10/0;
return "获取成功";
}
}
- 3)创建启动类
package com.itweid.exception;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ExceptionApp {
public static void main(String[] args) {
SpringApplication.run(ExceptionApp.class, args);
}
}
- 4)启动项目,在浏览器访问
http://127.0.0.1:8080/user/getLoginUser
由结果可知,Controller方法出现异常时,页面直接报错。接下来进行异常处理,使页面以更加友好的方式获取异常。
- 5)创建异常处理类,统一进行异常处理
package com.itweid.exception.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
//异常处理方法,Controller发生异常后会执行此方法,在此进行统一处理
@ExceptionHandler(Exception.class)
public String handleException(Exception e){
System.out.println("统一处理异常信息:" + e.getMessage());
return "系统错误,错误信息为:" + e.getMessage();
}
}
- 6)重启项目,再次访问
http://127.0.0.1:8080/user/getLoginUser
可以看到,页面不再报错,而是返回我们在统一异常处理类中规定好的提示信息。
- 7)需要注意的是,案例中
@ExceptionHandler(Exception.class)
注解是直接对全部异常进行统一处理。实际上可以对异常进行细分,分别进行不同的处理
例如,对空指针异常进行单独处理:
//空指针异常统一处理
@ExceptionHandler(NullPointerException.class)
public String nullPointerException(NullPointerException ex, HttpServletRequest request) {
return "空指针异常";
}
- 8)修改
UserController
方法,模拟空指针异常
// 获取当前登录用户信息
@GetMapping("/getLoginUser")
public String getLoginUser() {
// 模拟空指针异常
String str = null;
int length = str.length();
// 模拟异常
int i = 10/0;
return "获取成功";
}
- 9)重启项目,再次访问
http://127.0.0.1:8080/user/getLoginUser
…
本节完,更多内容查阅:后台管理系统的通用权限解决方案
延伸阅读:后台管理系统的通用权限解决方案(十)如何自定义SpringMVC的参数解析器