SpringBoot异常处理的五种方式
文章目录
前言
有五种常用的方式 1.自定义错误页面(默认处理异常的方式)2.@ExceptionHandle 注解处理异常
3.@ControllerAdvice+@ExceptionHandler (全局异常处理器)注解处理异常
4.配置 SimpleMappingExceptionResolver(全局异常处理器) 处理异常
5.自定义 HandlerExceptionResolver 类处理异常
提示:以下是本篇文章正文内容,下面案例可供参考
一、自定义错误页面(默认)?
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、使用步骤
1.引入Pom依赖
代码如下(示例):
<?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>
<groupId>com.usian</groupId>
<artifactId>springboot_error</artifactId>
<version>1.0-SNAPSHOT</version>
<!--
引入父级依赖 进行项目的自动配置
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
</parent>
<dependencies>
<!--
web启动器 springmvc的启动器
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--
log4j的启动器
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
<!--
Aop的启动器
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--
lombok依赖
-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
</project>
2.创建controller和html
代码如下(示例):
3.自定义错误页面(默认处理异常的方式)
直接在templates文件夹中添加一个error.html 作为报错信息展示界面
注意:必须名称为error
(1) springboot默认处理异常的方式
- 在templates目录下面,创建一个error.html页面。只要后台资源发生了异常(不管是什么异常),都统统的交给error页面来处理
- 如果我们需要对不同的异常做不同的处理,我们将错误页面命名为 错误状态码.html 放在模板引擎文件夹里面的 error文件夹下,
发生此状态码的错误就会来到 对应的页面
我们可以使用4xx和5xx作为错误页面的文件名来匹配这种类型的所有错误,精确优先(优先寻找精确的状态 码.html);
页面能获取的信息;
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验的错误都在这里
定义4xx.html或者5xx.html页面。在页面输出一些错误处理信息
<h3>这里报了一个500错误!!!</h3>
<h1>500</h1>
<h3>status:[[${
status}]]</h3>
<h3>timestamp:[[${
timestamp}]]</h3>
<h3>error:[[${
error}]]</h3>
<h3>exception:[[${
exception}]]</h3>
<h3>message:[[${
message}]]</h3>
4.@ExceptionHandle 注解处理异常
注意:吧error文件加和error.html文件名改一下,因为他俩优先级比较高,会覆盖后面写的错误页面
优点:可以自定义异常信息存储的key,自定义跳转视图的名称
缺点:需要编写大量的异常处理方法,不能跨controller,如果两个controller中出现同样的异常,需要重新编写异常处理的方法
5.@ControllerAdvice+@ExceptionHandler (全局异常处理器)注解处理异常
注意:注释之前的处理异常代码 加上注解**@ControllerAdvice+@ExceptionHandler**
步骤
1编写处理错误的页面 error1.html
2编写controller 测试
优点:统一管理异常,而不用一个一个页面写了,减少了页面的数量,不用一个个写500,404这些了!而是交给GlobalExceptionHandler 进行统一管理 一定要加注解
缺点:缺点:编写大量的异常处理方法,代码冗余
6.配置 SimpleMappingExceptionResolver(全局异常处理器) 处理异常
步骤:需要将SimpleMappingExceptionResolver注入到spring容器里面
注意:注释之前代码。。。。。。。。
package com.usian.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import java.util.Properties;
//将GlobalExceptionHandler变成配置类
@Configuration
public class GlobalExceptionHandler {
/**
* 这个方法返回值类型必须是:SimpleMappingExceptionResolver
*/
@Bean
public SimpleMappingExceptionResolver getExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties properties = new Properties();
/**
* 参数1:处理的具体的异常的类型
* 参数2:处理异常需要跳转到的视图
*/
properties.put("java.lang.NullPointerException","error3");
properties.put("java.lang.ArithmeticException","error3");
properties.put("java.lang.ArrayIndexOutOfBoundsException","error3");
resolver.setExceptionMappings(properties);
return resolver;
}
}
缺点:不显示具体异常信息
7.自定义 HandlerExceptionResolver 类处理异常
步骤1:实现HandlerExceptionResolver接口重写resolveException方法
注意:@Component给他加入到spring容器中
package com.usian.config;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyExceptionReslover implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
//所有异常都封装到Exception ex对象中去了
//此时只要判断异常的类型,做不同视图跳转
return null;
}
}
第二步:所有异常都封装到Exception ex对象中去了 , 此时只要判断异常的类型,做不同视图跳转判断异常的类型,做不同视图跳转
package com.usian.config;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class MyExceptionReslover implements HandlerExceptionResolver {
/*处理异常的方法*/
@Override
public ModelAndView resolveException(HttpServletRequest request
, HttpServletResponse response,
Object handler
, Exception ex) {
ModelAndView mv = new ModelAndView();
// 判断不同异常类型,做不同视图跳转
if (ex instanceof ArithmeticException) {
mv.setViewName("error3");
}
if (ex instanceof NullPointerException) {
mv.setViewName("error3");
}
mv.addObject("error", ex.toString());
return mv;
}
}
总结
SpringBoot异常处理的方式
例如:以上就是今天要讲的内容,本文仅仅简单介绍了SpringBoot异常处理的方式,一般都选择全局处理,比较方便。
如有啥不足的地方请指正。。。。。。