我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot@ExceptionHandler与@ControllerAdvice异常处理详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot@ExceptionHandler与@ControllerAdvice异常处理详解

前言

如果能将所有类型的异常处理从各层中解耦出来,则既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。幸运的是,Spring框架支持这样的实现。接下来将从自定义error页面。@ExceptionHandler注解以及@ControllerAdvice3种方式讲解Spring Boot应用的异常统一处理

具体处理步骤如下:

自定义error页面

在Spring Boot Web应用的class="lazy" data-src/main/resources/templates 目录下添加error.html页面 访问发生错误或异常时,Spring Boot将自动找到该页面作为错误页面。Spring Boot为错误页面提供了以下属性

  • timestamp 错误发生时间
  • status HTTP状态码
  • error 错误原因
  • exception 异常的类名
  • message 异常消息
  • errors BindingResult异常里的各种错误
  • trace 异常跟踪信息
  • path 错误发生时请求的URL路径

1: 创建名为com.ch.ch5_3.exception的包 并在该包中创建名为MyException 具体代码如下

package com.ch.ch5_3.exception;
public class MyException extends Exception {
	private static final long serialVersionUID = 1L;
	public MyException() {
		super();
	}
	public MyException(String message) {
		super(message);
	}
}

2:创建控制器类TestHandleExceptionController

创建名为com.ch,ch5_3.controller的包 并在该包中创建名为TestHandleExceptionController的控制器类,在该控制器类中,在4个请求处理方法,一个是导航到index.html 另外三个分别抛出不同的异常 部分代码如下

package com.ch.ch5_3.controller;
import java.sql.SQLException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
    public void db() throws SQLException { 
        throw new SQLException("数据库异常");
    }  
	@RequestMapping("/my")  
    public void my() throws MyException {  
        throw new MyException("自定义异常");
    }
	@RequestMapping("/no")  
    public void no() throws Exception {  
        throw new Exception("未知异常");
    } 
}

3:View视图页面

Thymeleaf模板默认将视图页面放在class="lazy" data-src/main/resources/templates目录下。因此我们在class="lazy" data-src/main/resources/templates 目录下新建html页面文件,index.html和error.html

在index.html页面中 有4个超链接请求,3个请求在控制器中有对应处理,另一个请求是404错误

部分代码如下

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>index</title>
<link rel="stylesheet" th:href="@{css/bootstrap.min.css}" rel="external nofollow"  rel="external nofollow"  />
<!-- 默认访问 class="lazy" data-src/main/resources/static下的css文件夹-->
<link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" rel="external nofollow"  rel="external nofollow"  />
				<a th:href="@{db}" rel="external nofollow" >处理数据库异常</a><br>
				<a th:href="@{my}" rel="external nofollow" >处理自定义异常</a><br>
				<a th:href="@{no}" rel="external nofollow" >处理未知错误</a>
				<hr>
				<a th:href="@{nofound}" rel="external nofollow" >404错误</a>
			</div>
		</div>
	</div>
</body>
</html>

error.html页面部分代码如下

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>error</title>
<link rel="stylesheet" th:href="@{css/bootstrap.min.css}" rel="external nofollow"  rel="external nofollow"  />
<!-- 默认访问 class="lazy" data-src/main/resources/static下的css文件夹-->
<link rel="stylesheet" th:href="@{css/bootstrap-theme.min.css}" rel="external nofollow"  rel="external nofollow"  />
</head>
<body>
            <div class="common-hint-word">
                <div th:text="${#dates.format(timestamp,'yyyy-MM-dd HH:mm:ss')}"></div>
                <div th:text="${message}"></div>
                <div th:text="${error}"></div>
            </div>
        </div>
    </div>
</body>
</html>

@ExceptionHandler注解

上面自定义页面并没有处理异常,可以使用@ExceptionHandler注解处理异常,如果有一个由该注解修饰的方法,那么当任何方法抛出异常时都由它来处理

添加一个注解修饰的方法 具体代码如下

@ExceptionHandler(value=Excetption.class)
public String handlerException(Exception e){
if(e istanceof SQLException){
return "sql error";
}
else if(e instanceof MYException){
return"myError";
}
else{
return "noerror";
}
}

@ControllerAdvice注解

使用它注解的类时当前Spring Boot应用中所有类的统一异常处理类,该类中使用@ExceptionHandler注解的方法统一处理异常,不需要在每个Controller中逐一定义异常处理方法,这是因为对所有注解了@ControllerAdvice注解进行全局异常处理

创建GlobalExceptionHandlerController的类 具体代码如下

package com.ch.ch5_3.controller;
import java.sql.SQLException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import com.ch.ch5_3.exception.MyException;
@ControllerAdvice
public class GlobalExceptionHandlerController {
	@ExceptionHandler(value=Exception.class)
	public String handlerException(Exception e) {
		//数据库异常
		if (e instanceof SQLException) {
			return "sqlError";
		} else if (e instanceof MyException) {//自定义异常
			return "myError";
		} else {//未知异常
			return "noError";
		}
	}
}

到此这篇关于SpringBoot @ExceptionHandler与@ControllerAdvice异常处理详解的文章就介绍到这了,更多相关SpringBoot @ExceptionHandler与@ControllerAdvice内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringBoot@ExceptionHandler与@ControllerAdvice异常处理详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot@ExceptionHandler与@ControllerAdvice异常处理详解

在SpringBoot应用的开发中,不管是对底层数据库操作,对业务层操作,还是对控制层操作,都会不可避免的遇到各种可预知的,不可预知的异常需要处理,如果每个处理过程都单独处理异常,那么系统的代码耦合度会很高,工作量大且不好统一,以后维护的工作量也很大
2022-11-13

JAVA异常与异常处理详解

一、异常简介什么是异常?异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域的情况,称之为异常。java中异常的体系是怎么样的呢?(推荐:java视频教程)1.Java中的所有不正常类都继承于Throwable类。Throwab
JAVA异常与异常处理详解
2020-06-12

springboot全局异常处理详解

一、单个controller范围的异常处理package com.xxx.secondboot.web;import org.springframework.web.bind.annotation.ExceptionHandler;impo
2023-05-31

详解SpringBoot中的统一异常处理

这篇文章主要介绍了详解SpringBoot中的统一异常处理,在独立的某个地方,比如单独一个类,定义一套对各种异常的处理机制,需要的朋友可以参考下
2023-05-19

SpringBoot配置全局异常处理器捕获异常详解

spring-boot统一异常捕获,异常时相对于return的一种退出机制,可以由系统触发,下面这篇文章主要给大家介绍了关于SpringBoot配置全局异常处理器捕获异常的相关资料,需要的朋友可以参考下
2023-05-14

Python异常处理详解

在shell脚本中,常用if来判断程序的某个部分是否可能会出错,并在if的分支中做出对应的处理,从而让程序更具健壮性。if判断是异常处理的一种方式,所有语言都通用。对于特性完整的编程语言来说,都有专门的异常处理机制,有些语言用起来可能会很复
2023-01-30

Python异常与错误处理详细讲解

这篇文章主要介绍了Python异常与错误处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2022-12-22

详解Java异常处理的使用与思考

异常处理的概念起源于早期的编程语言,如 LISP、PL/I 和 CLU。这些编程语言首次引入了异常处理机制,以便在程序执行过程中检测和处理错误情况。本文主要来介绍一下Java中的异常处理,需要的可以参考一下
2023-05-15

PHP异常处理:自定义异常类详解

php 中的自定义异常类允许开发者创建特定于应用程序的异常类型,添加额外的信息和处理逻辑。通过继承自 exception 类,自定义异常类可以包含属性(如错误代码)和方法(如获取错误详细信息)。这增强了 php 的异常处理机制,提供了更灵活
PHP异常处理:自定义异常类详解
2024-05-14

springboot断言异常封装与统一异常处理实现代码

异常处理其实一直都是项目开发中的大头,但关注异常处理的人一直都特别少,下面这篇文章主要给大家介绍了关于springboot断言异常封装与统一异常处理的相关资料,需要的朋友可以参考下
2023-01-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录