springBoot项目中的全局异常处理和自定义异常处理实现

 更新时间:2024年08月12日 09:58:17   作者:小白写代码hh  
异常是由于程序逻辑错误、运行环境问题、用户输入错误等原因导致的一种非正常的状态或事件,本文主要介绍了springBoot项目中的全局异常处理和自定义异常处理实现,具有一定的参考价值,感兴趣的可以了解一下

1 什么是异常

异常(Exception)是在程序执行过程中出现的一种特殊情况或错误。它可以是由于程序逻辑错误、运行环境问题、用户输入错误等原因导致的一种非正常的状态或事件。

在编程领域中,异常通常用来表示一种无法预料或处理的情况,它会导致程序无法继续正常执行。当程序运行过程中遇到异常,如果没有适当的处理机制,可能会导致程序崩溃或产生未预期的结果。

2 异常的种类

Checked Exception(已检查异常):这类异常是在编译时强制要求程序员进行处理的异常,如文件未找到、数据库连接失败等。Java 中的 checked exception 必须在方法签名中声明,或者使用 try-catch 块进行捕获处理,否则编译不通过。

Unchecked Exception(未检查异常):也称为运行时异常(RuntimeException),通常是由于编程错误或者运行环境出现问题引起的异常,如空指针异常(NullPointerException)、数组越界异常(ArrayIndexOutOfBoundsException)等。编译器不要求强制捕获或者声明这类异常,程序员可以选择捕获和处理,但不是必须的。

处理异常的主要目的是为了保证程序的稳定性和可靠性。通常的处理方式包括捕获异常、记录异常信息、恢复程序状态、通知用户等。

3 解决异常的方式

1、捕获和处理异常(try-catch)

  • 使用 try-catch 块来捕获可能抛出异常的代码块。
  • 在 try 块中编写可能引发异常的代码,然后在 catch 块中处理异常。
  • 这种方式适用于已检查异常(checked exception),以及可以预料到可能出现的异常情况

2、抛出异常(throw)

  • 在方法中使用 throw 关键字抛出异常,告知调用者可能发生的异常情况。
  • 通常在方法内部检测到无法处理的情况时抛出异常,将问题交给上层调用者处理。

3、使用 finally 块

  • finally 块中的代码总是会被执行,无论是否抛出异常,用于释放资源或者确保某些操作一定会执行。

4、使用 try-with-resources

  • 对于实现了 AutoCloseable 接口的资源,可以使用 try-with-resources 语句,确保资源在使用后自动关闭。
  • 适用于需要手动关闭的资源管理,如文件操作、数据库连接等。

4 全局异常处理器和自定义异常处理器

全局异常处理器是一种集中处理应用程序中所有未捕获异常的机制,常用于 Web 应用程序中,以提供统一的异常处理和用户友好的错误响应。在 Java 的 Spring 框架中,可以使用 @ControllerAdvice 和 @ExceptionHandler 注解来实现全局异常处理。在全局异常处理器中,解决了异常种类繁多以及每个业务里面都需要去处理异常,所以Spring中提供了一种上层调用的方式来进行异常处理,把数据层和业务层的异常都向上抛放到应用层来处理,这样就可以统一对异常进行处理

类:ProjectExceptionAdvice

package com.hyh.ad.common.exceptionhandler;

import cn.hutool.core.date.DateTime;
import com.hyh.ad.common.core.domain.AjaxResult;
import com.hyh.ad.common.exceptions.BusinessException;
import com.hyh.ad.common.exceptions.SystemException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


/**
 * 异常处理切面
 * 处理BusinessException异常
 * 处理SystemException异常
 * @author hyh
 */

@Slf4j
@RestControllerAdvice
public class ProjectExceptionAdvice {
    /**
     * @param  e
     * @return 业务异常处理的信息
     */
    @ExceptionHandler(BusinessException.class)
    public AjaxResult handleBusinessException(BusinessException e) {
        //记录日志
        log.error(e.getMessage(), e);
        //返回错误信息
        return AjaxResult.error(e.getCode(), e.getMessage());
    }

    /**
     * @param  e
     * @return 系统异常处理的信息
     */
    @ExceptionHandler(SystemException.class)
    public AjaxResult handleSystemException(BusinessException e) {
        //记录日志
        log.error(e.getMessage(), e);
        //返回错误信息
        return AjaxResult.error(e.getCode(), e.getMessage());
    }

    /** 
     * 自定义异常处理的信息
     * 其他异常都经过这个来处理 也可以自己来定义自己需要的异常处理
     * @param  e
     * @return 
     */
    @ExceptionHandler(Exception.class)
    public AjaxResult doException(Exception e) {
        //记录日志
        log.error(e.getMessage(), e);
        //返回错误信息
        return AjaxResult.error(e.getMessage() + DateTime.now());
    }
}

其中AjaxResult请换成自己封装的用于返回数据结果的对象 

在这个类里面可以对所有的异常进行处理,包括系统异常、编译异常、运行异常、自定义异常这些异常返回相对友好的信息。

类:BusinessException 业务异常

package com.hyh.ad.common.exceptions;


/**
 * 业务异常处理器
 * @author hyh
 */
public class BusinessException extends RuntimeException{

    /*
     * 异常消息
     */
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public BusinessException(Integer code) {
        this.code = code;
    }

    public BusinessException( Integer code,String message) {
        super(message);
        this.code = code;
    }

    public BusinessException(Integer code,String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }

    public BusinessException(Throwable cause, Integer code) {
        super(cause);
        this.code = code;
    }

    public BusinessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, Integer code) {
        super(message, cause, enableSuppression, writableStackTrace);
        this.code = code;
    }
}

 类:SystemException 系统异常

package com.hyh.ad.common.exceptions;
/**
 * 系统异常处理器
 * @author  hyh
 */
public class SystemException extends RuntimeException{

    /*
     * 异常消息
     */
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public SystemException(Integer code) {
        this.code = code;
    }

    public SystemException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public SystemException(Integer code, String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }

    public SystemException(Throwable cause, Integer code) {
        super(cause);
        this.code = code;
    }

    public SystemException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, Integer code) {
        super(message, cause, enableSuppression, writableStackTrace);
        this.code = code;
    }
}

5 测试异常处理

这里就是我模拟的一个发送邮箱验证码的异常,他把异常信息返还给了前端,并且还带有异常发生的时间。

接下来 我手动模拟了一个异常 然后再次请求一下数据

可以看到 返回了我们自定义的异常信息,包括提示信息和编码 

到此这篇关于springBoot项目中的全局异常处理和自定义异常处理实现的文章就介绍到这了,更多相关springBoot 全局异常和自定义异常内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 几道java循环练习题(适合新人)

    几道java循环练习题(适合新人)

    这篇文章主要给大家介绍了几道java循环练习题,非常适合刚入门的java新人,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • springboot使用kafka事务的示例代码

    springboot使用kafka事务的示例代码

    Kafka 同数据库一样支持事务,当发生异常的时候可以进行回滚,确保消息监听器不会接收到一些错误的或者不需要的消息,本文就来介绍一下springboot使用kafka事务的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • kotlin之协程的理解与使用详解

    kotlin之协程的理解与使用详解

    这篇文章主要介绍了kotlin之协程的理解与使用详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Java计算两个汉字相似度的实现方法

    Java计算两个汉字相似度的实现方法

    有时候我们希望计算两个汉字的相似度,比如文本的 OCR 等场景,用于识别纠正,本文给大家详细介绍了Java计算两个汉字相似度的实现方法,文中有详细的实现代码,需要的朋友可以参考下
    2023-11-11
  • java实现文件导入导出

    java实现文件导入导出

    这篇文章主要介绍了java实现文件导入导出的方法和具体示例代码,非常的简单实用,有需要的小伙伴可以参考下
    2016-04-04
  • Spring Boot JWT登录授权使用(无感刷新)

    Spring Boot JWT登录授权使用(无感刷新)

    JWT作为一种轻量级的身份认证与授权方案,凭借其无状态、可跨域、易于扩展的特性,成为 Spring Boot 项目中实现认证授权的主流选择,本文详解Spring Boot整合 JWT 实现登录认证与授权的全流程,助力开发者快速搭建安全可靠的认证授权体系,感兴趣的可以了解一下
    2026-04-04
  • 深入了解Java8中的时区日期时间

    深入了解Java8中的时区日期时间

    Java 在 java.time 包中也提供了几个类用于处理需要关注时区的日期时间 API,本文将通过简单的示例讲讲它们的用法,需要的可以参考一下
    2023-04-04
  • SpringBoot中webSocket实现即时聊天

    SpringBoot中webSocket实现即时聊天

    这篇文章主要介绍了SpringBoot中webSocket实现即时聊天,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Java 中普通代码块,构造代码块,静态代码块区别及代码示例

    Java 中普通代码块,构造代码块,静态代码块区别及代码示例

    这篇文章主要介绍了Java 中普通代码块,构造代码块,静态代码块区别及代码示例的相关资料,需要的朋友可以参考下
    2017-01-01
  • 深入理解java中Arrays.sort()的用法

    深入理解java中Arrays.sort()的用法

    这篇文章主要介绍了深入理解java中Arrays.sort()的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论