SpringBoot框架(7)--异常处理
项目中对异常统一处理非常常见,本文介绍一下springboot如何处理异常。
springboot异常处理主要用到2个注解,分别是@ControllerAdvice+@ExceptionHandler。
局部@ExceptionHandler
全局@ControllerAdvice+@ExceptionHandler
直接上代码demo springboot web项目中使用方法。
首先看看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 https://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.6.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.mike.study</groupId>
<artifactId>springboot_exception</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_exception</name>
<description>Demo project for Spring Boot exception</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
通常项目都会有自己的自定义异常类,这里的MyException,ResourceNotFoundException都是extends Exception类,用来测试是否能处理指定的异常。
/**
* @Classname ResourceNotFoundException
* @Created by Michael
* @Date 2023/5/11
* @Description 资源找不到异常
*/
public class ResourceNotFoundException extends Exception {
public ResourceNotFoundException(String message) {
super(message);
}
}
最后定义全局的异常处理类,添加@ControllerAdvice注解
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* @Classname GloableExceptioon
* @Created by Michael
* @Date 2023/5/11
* @Description 全局异常处理类
*/
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({Exception.class,RuntimeException.class})
public String globalException(){
System.out.println(this.getClass());
return "500.html";
}
@ExceptionHandler({ResourceNotFoundException.class})
public String notFoundException(){
System.out.println(this.getClass());
return "404.html";
}
}
这里的class是使用了@ControllerAdvice,该注解主要处理全局数据,而方法的@ExceptionHandler可以指定方法要处理那些异常,该demo的处理方式是发现了指定异常后将会跳转到制定的页面,比如404.html, 500.html。
另一种常见的情况,如果业务有自己的异常处理逻辑,并不需要交由全局处理,怎么办呢?
业务逻辑如果想自己处理异常则更为简单,直接在处理方法上添加@ExceptionHandle即可。比如当前如果出现notFountException,则调到404.xml。
import com.mike.study.excepton.MyException;
import com.mike.study.excepton.ResourceNotFoundException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
/**
* @Classname ExceptionController
* @Created by Michael
* @Date 2023/5/11
* @Description TODO
*/
@RestController
public class ExceptionController {
@ExceptionHandler(ResourceNotFoundException.class)
public String notFountException(Exception ex){
System.out.println(ex.getMessage());
return "404.html";
}
@GetMapping("/ex/local")
public String localException() throws MyException {
throw new MyException("测试本地异常");
}
@GetMapping("/ex/notfound")
public String notFoundException() throws ResourceNotFoundException {
File file = new File("C:\\test.txt");
if (!file.exists()) {
throw new ResourceNotFoundException("资源找不到异常");
}
return "index.html";
}
@GetMapping("/ex/run")
public String runtimeException() throws RuntimeException {
File file = new File("C:\\test.txt");
if (!file.exists()) {
throw new RuntimeException("运行时异常");
}
return "index.html";
}
@GetMapping("/ex/serverErr")
public String serverErrException() throws MyException {
throw new RuntimeException("服务器异常");
}
}
以上在controller直接处理了异常。处理异常的优先级是如果发生异常,则优先在当前类检查当前是否有处理异常,如果有,则匹配当前的处理method,否则交由全局异常类处理。
springboot处理异常就是这么简单。
如果该文章对你有所帮助,请点个赞支持下,谢谢!

浙公网安备 33010602011771号