深入聊一聊springboot项目全局异常处理那些事儿

yizhihongxing

深入聊一聊Spring Boot项目全局异常处理那些事儿

Spring Boot是一个非常流行的Java框架,其主要优点之一是非常简单地设置全局异常处理程序。本文将在解释全局异常处理的基本概念的基础上,提供两个示例,以帮助你更好地理解和使用此功能。

SpringBoot全局异常处理基础知识

全局异常处理是指在整个应用程序中捕获并处理抛出的异常。对于Java应用程序而言,全局异常处理在某些情况下非常重要,因为它可以大大提高应用程序的可靠性。

Spring Boot的全局异常处理主要通过自定义异常处理器实现。在Spring中,异常处理器主要通过实现HandlerExceptionResolver接口来实现。Spring Boot则提供了一个更简单的方式来处理异常:通过添加@ControllerAdvice注解的类。

@ControllerAdvice是一个用于定义@ExceptionHandler@InitBinder@ModelAttribute方法的注解。其中,@ExceptionHandler被用于处理异常。

以下是一些基本的全局异常处理方法。

@ControllerAdvice
public class GlobalExceptionHandler {

    //处理RuntimeException并返回错误信息 HTTP状态码为500
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public String handleRuntimeException(RuntimeException ex) {
        return "系统错误:"+ex.getMessage();
    }

    //处理自定义异常CustomException并返回错误信息 HTTP状态码为400
    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public String handleCustomException(CustomException ex) {
        return "自定义异常:"+ex.getMessage();
    }
}

上述代码演示了如何定义全局异常处理方法。在这个例子中,我们使用了@ControllerAdvice注解来定义一个全局异常处理程序并处理RuntimeException和自定义异常CustomException,并且返回特定的错误文本。

具体实现

通常情况下,我们定义全局异常处理程序的实际过程如下:

  1. 创建异常类并继承RuntimeExceptionException,根据异常实际情况实现自定义的异常信息。
  2. 创建全局异常处理类,通过@ControllerAdvice注解来声明类,并添加@ExceptionHandler注解来指示要处理哪个具体的异常类。
  3. 处理异常时,可以返回一个特定的错误页面或错误信息。

以下是两个具体的实现示例:

第一个示例

假设在我们的应用程序中,我们有一个自定义的ResourceNotFoundException异常,它被用于处理用户请求不存在的资源时抛出。在这种情况下,我们可以创建一个全局异常处理类来处理所有的ResourceNotFoundException异常。代码如下:

自定义异常类

public class ResourceNotFoundException extends RuntimeException {

    private String resourceName;
    private String fieldName;
    private Object fieldValue;

    public ResourceNotFoundException(String resourceName, String fieldName, Object fieldValue) {
        super(String.format("%s not found with %s : '%s'", resourceName, fieldName, fieldValue));
        this.resourceName = resourceName;
        this.fieldName = fieldName;
        this.fieldValue = fieldValue;
    }

    public String getResourceName() {
        return resourceName;
    }

    public String getFieldName() {
        return fieldName;
    }

    public Object getFieldValue() {
        return fieldValue;
    }
}

全局异常处理类

@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    protected ResponseEntity<Object> handleResourceNotFound(
            ResourceNotFoundException ex) {
        ExceptionResponse response = new ExceptionResponse(ex.getMessage(), HttpStatus.NOT_FOUND);
        return new ResponseEntity<Object>(response, HttpStatus.NOT_FOUND);
    }
}

ErrorResponse类

public class ExceptionResponse {

    private String message;
    private HttpStatus status;

    public ExceptionResponse(String message, HttpStatus status) {
        super();
        this.message = message;
        this.status = status;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public HttpStatus getStatus() {
        return status;
    }

    public void setStatus(HttpStatus status) {
        this.status = status;
    }

}

在这个示例代码中,我们使用了一个@ControllerAdvice注解的类RestExceptionHandler来定义全局异常处理程序,并添加了@ExceptionHandler注解来指示要处理ResourceNotFoundException异常。在异常处理方法中,我们返回了一个ErrorResponse对象,其中包含了我们定义的异常消息和HTTP响应码。

第二个示例

假设我们的应用程序中有一个自定义的CustomException异常,它被用于处理我们自己的业务逻辑异常。在这种情况下,我们可以创建一个全局异常处理类来处理所有的CustomException异常。代码如下:

自定义异常类

public class CustomException extends RuntimeException {

    public CustomException(String message) {
        super(message);
    }

}

全局异常处理类

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ModelAndView handleCustomException(HttpServletRequest request, Exception ex){

        ModelAndView model = new ModelAndView("custom_error");
        model.addObject("exception", ex);
        model.addObject("url", request.getRequestURL());

        return model;
    }
}

在这个示例代码中,我们使用了一个@ControllerAdvice注解的类GlobalExceptionHandler来定义全局异常处理程序,并添加了@ExceptionHandler注解来指示要处理CustomException异常。在处理异常方法中,我们返回一个错误视图和一些附加的数据,例如异常消息和请求URI。

总结

在Spring Boot应用程序中,全局异常处理程序是实现强大和可靠的应用程序的重要组成部分。使用@ControllerAdvice注解,我们可以轻松地开发自己的全局异常处理程序。

在这篇文章中,我们探讨了全局异常处理程序的基本概念,并给出了两个不同的示例。如有疑问或建议,欢迎留言讨论。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入聊一聊springboot项目全局异常处理那些事儿 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • MySql删除和更新操作对性能有影响吗

    当进行删除和更新操作时,MySQL会涉及到数据的物理删除和更新,这可能会对性能产生一定的影响。下面我将详细讲解MySQL的删除和更新操作对性能的影响以及如何优化。 MySQL删除操作对性能的影响 MySQL的删除操作会先查询要删除的数据,然后再将其从磁盘上删除。如果该表上有索引,则删除操作可能会导致索引的重建,进一步降低性能。此外,删除操作还会影响表的统计信…

    database 2023年5月19日
    00
  • DBMS的集中式和客户服务器架构

    DBMS(数据库管理系统)是一种将数据存储、管理、访问的软件系统。DBMS可以采用不同的架构,其中集中式架构和客户服务器架构是两种常见的架构。 集中式架构 在集中式架构中,数据存储在一个中央服务器上,所有的数据访问请求都发送到这个服务器进行处理。客户端计算机只需使用数据库管理软件并连接到服务器即可查询和操作数据。这种架构的优点包括易于管理和维护、数据安全和一…

    database 2023年3月27日
    00
  • MySQL内联和外联查询

    内连: 内连接是通过在查询中设置连接条件的方式,来移除查询结果集中某些数据行后的交叉连接。简单来说,就是利用条件表达式来消除交叉连接的某些数据行。 在MySQL FROM 子句中使用关键字 INNER JOIN 连接两张表,并使用 ON 子句来设置连接条件。如果没有任何条件,INNER JOIN 和 CROSS JOIN 在语法上是等同的,两者可以互换。 语…

    MySQL 2023年4月13日
    00
  • go-cqhttp环境配置及安装过程

    下面是关于”go-cqhttp环境配置及安装过程”的完整攻略: 一、概述 go-cqhttp是一款基于Goland开发的跨平台QQ机器人框架,支持多种平台和协议,可通过HTTP API进行交互。本篇攻略将详细介绍go-cqhttp环境配置和安装的过程。 二、安装go-cqhttp 下载安装包 下载go-cqhttp安装包,可以在官方GitHub库中下载,也可…

    database 2023年5月22日
    00
  • 从Oracle数据库中读取数据自动生成INSERT语句的方法

    生成INSERT语句是数据库操作中常用的一项功能,可以方便地将已有数据复制到其他表格或者数据库中。对于Oracle数据库,可以使用以下方法来读取数据并生成INSERT语句: 方法一:使用PL/SQL Developer工具 打开PL/SQL Developer工具,连接到数据库。 在Object Navigator窗口中,选择要读取数据的表格,点击右键并选择…

    database 2023年5月21日
    00
  • mysql 事务隔离级别之可能出现的问题:同一事务中无法查询已插入但未提交的数据

    若要实现查询事务中已插入但是未提交的数据则需要设置MySQL事务隔离级别为 read-uncommitted 下面了解一下MySQL的事务隔离级别: 一、事务的基本要素(ACID)   1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一…

    MySQL 2023年4月13日
    00
  • SQL – 注释

    下面是SQL注释的完整攻略。 SQL注释 SQL注释是一种在SQL语言中添加注释的方法。注释是用于在SQL查询的不同部分中添加描述和解释的文本。SQL注释可以帮助其他开发人员和自己快速理解查询的规则和目的。 在SQL中,有两种类型的注释: 单行注释:通常用于注释SQL查询中的单个语句。单行注释使用两条短杠(–)开始,并在该语句的结尾处结束。 sqlSELE…

    database 2023年3月27日
    00
  • 如何使用Python在MySQL中使用事务日志?

    在MySQL中,事务日志是一种用于记录数据库中所有更改的机制。在Python中,可以使用MySQL连接来执行事务日志查询。以下是在Python中事务日志的完攻略,包括事务日志的基本语法、使用事务日志的示例以及如何在Python中事务日志。 事务日志的基本语法 在MySQL中,可以使用SHOW BINLOG EVENTS语句来查看事务日志。以下是查看事务日志的…

    python 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部