当前位置: 首页 > article >正文

java项目当中的全局异常处理

1.开发一个全局异常处理器:

package com.atguigu.spzx.common.exception;

import com.atguigu.spzx.model.vo.common.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @version: java version 1.8
 * @Author: Mr Orange
 * @description:
 * @date: 2025-02-04 15:59
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(Exception.class)
    public Result handleException(Exception e){
    //打印异常信息

    e.printStackTrace();
    return Result.fail(e.getMessage());
}

@ExceptionHandler(IllegalArgumentException.class)
    public Result illegalArgumentException(IllegalArgumentException e){
    //打印异常信息
    System.out.println("打印非法参数异常");
    e.printStackTrace();
    return Result.fail(e.getMessage());
}
}

2.在spzx-manager中使用全局异常处理器:

方式一:在启动类上使用@Import注解导入全局异常处理器到spring容器中

@Import()
@ComponentScan()

方式二:自定义注解对@Import注解进行封装,然后在启动类上使用自定义注解

package com.atguigu.spzx.common.anno;

import com.atguigu.spzx.common.exception.GlobalExceptionHandler;
import org.springframework.context.annotation.Import;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @version: java version 1.8
 * @Author: Mr Orange
 * @description:
 * @date: 2025-02-04 19:26
 */
//加在类上
@Target(ElementType.TYPE)
//运行时生效
@Retention(RetentionPolicy.RUNTIME)
@Import(GlobalExceptionHandler.class)
public @interface EnableGlobaleExceptionHandler {

}

 

- - - - **全局异常处理2**

        以前写法,所有的Controller层方法均需要增加`try-catch`逻辑,使用Spring MVC提供的**全局异常处理**功能,可以将所有处理异常的逻辑集中起来,进而统一处理所有异常,使代码更容易维护。

        具体用法如下,详细信息可参考[官方文档](https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-exceptionhandler.html):

   1.创建一个自定义的运行异常LeaseException

package com.atguigu.lease.common.exception;

import com.atguigu.lease.common.result.ResultCodeEnum;
import lombok.Data;

@Data
public class LeaseException extends RuntimeException{
    //异常状态码
    private Integer code;
    /**
     * 通过状态码和错误消息创建异常对象
     * @param message
     * @param code
     */
    public LeaseException(String message, Integer code) {
        super(message);
        this.code = code;
    }

    /**
     * 根据响应结果枚举对象创建异常对象
     * @param resultCodeEnum
     */
    public LeaseException(ResultCodeEnum resultCodeEnum) {
        super(resultCodeEnum.getMessage());
        this.code = resultCodeEnum.getCode();
    }
    @Override
    public String toString() {
        return "LeaseException{" +
                "code=" + code +
                ", message=" + this.getMessage() +
                '}';
    }

}

2.  开发一个全局异常处理类

package com.atguigu.lease.common.exception;

import com.atguigu.lease.common.result.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public Result error(Exception e){
        e.printStackTrace();
        return Result.fail();
    }
    @ExceptionHandler(LeaseException.class)
    public Result error(LeaseException e){
        e.printStackTrace();
        return Result.fail(e.getCode(),e.getMessage());
    }
}

上述代码中的关键注解的作用如下

        `@ControllerAdvice`用于声明处理全局Controller方法异常的类

        `@ExceptionHandler`用于声明处理异常的方法,`value`属性用于声明该方法处理的异常类型

        `@ResponseBody`表示将方法的返回值作为HTTP的响应体(无)

        **注意:**

        全局异常处理功能由SpringMVC提供,因此需要在**common模块**的`pom.xml`中引入如下依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

      - **修改Controller层代码**

        由于前文的`GlobalExceptionHandler`会处理所有Controller方法抛出的异常,因此Controller层就无需关注异常的处理逻辑了,因此Controller层代码可做出如下调整。直接throw异常就行

    public void removeApartmentById(Long id) {
        if(roomInfoService.count(new LambdaQueryWrapper<RoomInfo>().eq(RoomInfo::getApartmentId,id))>0){
           throw new LeaseException(ResultCodeEnum.DELETE_ERROR);
        }}


http://www.kler.cn/a/532535.html

相关文章:

  • C#中的委托(Delegate)
  • Windows图形界面(GUI)-QT-C/C++ - QT Tab Widget
  • vim-plug的自动安装与基本使用介绍
  • git进阶--3---git pull和git fetch的区别与联系
  • Linux:文件系统(软硬链接)
  • 《DeepSeek R1:7b 写一个python程序调用摄像头获取视频并显示》
  • WPS计算机二级•幻灯片的音视频表格与图形
  • 算法设计-哈夫曼树(C++)
  • kafka集群性能调优方案
  • DeepSeek 登顶140国应用商店榜首
  • 【BUUCTF杂项题】FLAG
  • C++输入输出(上)
  • CSS --- 设置不自动换行
  • 代码随想录算法训练营第十七天| 二叉树5
  • Linux——文件与磁盘
  • 求组合数(递推法、乘法逆元、卢卡斯定理、分解质因数)
  • 介绍一下Mybatis的Executor执行器
  • springboot/ssm互联网智慧医院体检平台web健康体检管理系统Java代码编写
  • 【NLP百面百过】大模型算法面试高频面题(全面整理 ʘ‿ʘ)
  • Vue.js组件开发-实现全屏手风琴幻灯片切换特效
  • GESP6级语法知识(六):(动态规划算法(六)多重背包)
  • 爬虫学习笔记之Robots协议相关整理
  • C++模板编程——可变参类模板
  • IOS开发日志-ios新建项目后-将storyboard去掉,版本调整为IOS13以下
  • 关于算尽圆周率
  • 使用 Go 语言调用 DeepSeek API:完整指南