首页 > 编程语言 >Java自定义异常和全局异常处理

Java自定义异常和全局异常处理

时间:2024-03-07 10:56:34浏览次数:26  
标签:code return 自定义 Wrapper Java 异常 public

1、自定义异常:自定义异常类 BusinessException extends RuntimeException:RuntimeException是 Java 提供的一个运行时异常类。

public class BusinessException extends RuntimeException {
 
    private int code;
    //使用枚举构造
    public BusinessException(HttpCodeEnum httpCodeEnum){
        super(httpCodeEnum.getMsg());
        this.code=httpCodeEnum.getCode();
    }
    //使用自定义消息体
    public BusinessException(HttpCodeEnum httpCodeEnum, String msg){
        super(msg);
        this.code=httpCodeEnum.getCode();
    }
    //根据异常构造
    public BusinessException(HttpCodeEnum httpCodeEnum, Throwable msg){
        super(msg);
        this.code=httpCodeEnum.getCode();
    }
}

异常枚举类:

public enum HttpCodeEnum {
    SUCCESS(200, "操作成功"),
    NEED_LOGIN(401, "需要登录后操作"),
    NO_OPERATOR_AUTH(403, "无权限操作"),
    SYSTEM_ERROR(500, "出现错误")
    int code;
    String msg;
    HttpCodeEnum(int code, String errorMessage) {
        this.code = code;
        this.msg = errorMessage;
    }
    public int getCode() {
        return code;
    }
    public String getMsg() {
        return msg;
    }
}

2、自定义全局异常拦截:使用 @RestControllerAdvice 注解和 @ExceptionHandler 注解来实现全局异常拦截

@ExceptionHandler()用于匹配程序发生的异常 然后做出对应的响应
@ResponseStatus(HttpStatus.OK) 表示返回的http状态码,例如如果想要程序抛出异常时候 http状态码还是200 就可以使用HttpStatus.OK,响应体的实际异常状态码由自定义异常code决定,两者并不一致。

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    /**
     * 参数非法异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(IllegalArgumentException.class)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public Wrapper<?> illegalArgumentException(IllegalArgumentException e) {
        log.error("参数非法异常={}", e.getMessage(), e);
        return WrapMapper.wrap(Wrapper.ERROR_CODE, e.getMessage());
    }

    /**
     * 业务异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(BusinessException.class)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public Wrapper<?> businessException(BusinessException e) {
        log.error("业务异常={}", e.getMessage(), e);
        return WrapMapper.wrap(Wrapper.ERROR_CODE, e.getMessage());
    }

    /**
     * 主鍵冲突异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(DuplicateKeyException.class)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public Wrapper<?> duplicateKeyException(DuplicateKeyException e) {
        log.error("主鍵冲突异常={}", e.getMessage(), e);
        return WrapMapper.wrap(Wrapper.ERROR_CODE, "请稍后再试", WrapMapper.wrap(Wrapper.ERROR_CODE, "请稍后再试"));
    }

/** * 全局异常 * * @param e * @return */ @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public Wrapper<?> exception(Exception e) { log.error("保存全局异常信息 ex={}", e.getMessage(), e); return WrapMapper.wrap(Wrapper.ERROR_CODE, e.getMessage()); } }

 

标签:code,return,自定义,Wrapper,Java,异常,public
From: https://www.cnblogs.com/wlong-blog/p/18058397

相关文章

  • JavaScript 最新动态:2024 年新功能
    前言随着Web技术的日新月异,JavaScript也在不断地吸收新的特性和技术,以满足日益复杂和多样化的开发需求。在2024年,JavaScript迎来了一系列令人瞩目的新功能,这些功能不仅提升了开发者的效率,也极大地丰富了Web应用的表现力和交互性。在接下来的内容中,我们将逐一介绍这些新......
  • java mysql事物特性记录,在同一事物中更新执行后,立即查询得到的是新数据还是旧数据?
    在Java中,如果你使用MySQL,并且你在一个事务方法中执行了更新操作,那么在这个事务结束并提交之前,其他事务或查询(非同一事务内的)是看不到你的更新结果的。这是数据库事务的隔离性所保证的。 但是,如果你在同一事务中立即执行查询,你将看到更新后的数据。因为查询和更新都在同一个事务......
  • javascript如何循环遍历对象
    在JavaScript中有多种循环遍历对象的方法,下面本篇文章就来给大家介绍一下使用JavaScript循环遍历对象的方法,希望对大家有所帮助。1、使用for循环for循环是js中最常用的一个循环工具,经常用于数组的循环遍历。letarr=[1,2,3];for(leti=0;i<arr.length;i++){co......
  • Java开发者的Python快速进修指南:掌握T检验
    前言T检验是一种用于比较两个独立样本均值差异的统计方法。它通过计算T值和P值来判断样本之间是否存在显著性差异。通常情况下,我们会有两组数据,例如一组实验组和一组对照组。T检验的原假设是两组样本的均值相等,备假设是两组样本的均值不相等。T检验会计算一个T值,表示两组样本均......
  • 面试高频题:Java并发包有些什么?
    面试过Java研发岗位的同学,相信很多都碰到过面试官问这么一道题:Java并发包有些什么?Java并发包,就是java.util.concurrent包下的类和子包。大体分为三类:一:线程池工具 核心类为ThreadPoolExecutor,通过这个类,可以构建出各种线程池。二:原子工具如AtomicInteger、AtomicLong等,通......
  • 【转】[Java]引入Redisson可能会出现项目启动失败问题解决
    转自:https://blog.csdn.net/bengbuguang4321/article/details/121951650在启动项目时,Redisson自己会启动一个Redisson连接池,尝试连接redis,这时候如果遇到网络不通就会出现问题,因为redis连接不上,导致项目启动不了解决方法是:1、重新空实现了一个RedissonClient/***@ClassNa......
  • JAVA API:ArrayList应用案例
    packagecom.itheima.ArrayList;importjava.util.ArrayList;publicclassDemo2{publicstaticvoidmain(String[]args){ArrayList<String>list=newArrayList<>();list.add("Java入门");list.add("宁夏枸杞&......
  • Java连接PostgreSQL数据库测试
    importjava.sql.DriverManager;importjava.sql.Connection;importjava.sql.SQLException;importjava.sql.ResultSet;importjava.sql.Statement;publicclassPG{publicstaticvoidmain(String[]args){System.out.println("PostgreSQLJDBC......
  • 带析构语义的类的C++异常处理
    C++异常处理#include<iostream>#include<string>usingnamespacestd;classMyException{public:MyException(conststring&message):message(message){}~MyException(){}conststring&getMessage()const{returnmessage;}pr......
  • 解析properties文件通用Java工具类
    importcom.sun.xml.internal.bind.v2.TODO;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;imp......