自定义异常和全局异常处理的实现和简单使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

记录一下自定义全局异常的抛出和自定义异常的使用


提示:以下是本篇文章正文内容,下面案例可供参考

一、自定义异常是什么?

全局异常是对那些没有被try-catch捕获的错误的抛出方式的处理,常见的比如空指针异常和IO异常数学计算异常这些,通常这些错误结果的格式是不能直接返回给前端看到所以可以使用全局异常的方式对这些错误进行处理之后用我们自己的返回体格式返回给前端

二、使用步骤

1.创建一个我们自己的异常类

代码如下(示例):
不一定要继承RuntimeException也可以,这里使用lombok实现基本的get(),set()方法,然后写了一个可以自定义异常信息的构造方法

@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor

public class FirstException extends RuntimeException {
    protected String errorMessage;

    public FirstException(String errorMessage) {
        super(errorMessage);
        this.errorMessage = errorMessage;
    }
}

2.再创建一个测试的controller

@RestController
@RequestMapping("/testException")
public class TestExceptionController {

    @GetMapping("/FirstException")
    public Object FirstException() {
        throw new FirstException("自定义异常抛出测试");
    }
}

此时访问此接口可以得到以下结果
测试自定义抛出异常的结果
到这里我们就实现了一个自定义的异常


二、全局异常是什么?


我们在开发的过程中肯定不会把上面这种异常直接返回给前端,而是应该处理为统一的返回格式,所以再实现了自定义的异常后我们还需要对这些异常进行格式处理这里就需要用到全局异常

1、ControllerAdvice

要实现把上述的异常的格式转换成我们返回给前端的格式我们就需要用到@ControllerAdvice这个注解
具体的使用方式如下:

package com.example.ExceptionDemo.handler;

import com.example.ExceptionDemo.myExceptions.FirstException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
@ResponseBody
@Slf4j
public class ExceptionHandler {

    @org.springframework.web.bind.annotation.ExceptionHandler(FirstException.class)
    public Object FirstExceptionHandler(FirstException firstException) {
        log.error("运行时异常,原因是{}", firstException.getErrorMessage());
        return "自定义的返回体和返回内容";
    }

}

在增加以上的ExceptionHandler后我们再访问一次刚才那个接口可以在前端得到以下结果
postman测试结果
而我们后端的日志中有以下内容:
后端控制台打印内容
除了自定义的异常外还可以对空指针异常和计算异常这些原生异常做一样的操作在刚才的handler中再增加两个处理异常的方法

    @org.springframework.web.bind.annotation.ExceptionHandler(NullPointerException.class)
    public Object FirstExceptionHandler(NullPointerException nullPointerException) {
        log.error("运行时异常,原因是{}", nullPointerException.getMessage());
        return "空指针异常测试";
    }

    @org.springframework.web.bind.annotation.ExceptionHandler(ArithmeticException.class)
    public Object FirstExceptionHandler(ArithmeticException arithmeticException) {
        log.error("运行时异常,原因是{}", arithmeticException.getMessage());
        return "计算异常测试";
    }

再在测试类中增加两个接口测试

    @GetMapping("/nullPointException")
    public Object nullPointException() {
        throw new NullPointerException("");
    }

    @GetMapping("/ArithmeticException")
    public Object ArithmeticException() {
        try {
            int a = 1 / 0;
        } catch (ArithmeticException e) {
            throw new ArithmeticException("");
        }
        return null;
    }

空指针

计算异常
后端结果
到此为止全局异常处理就实现了


三、后端异常的处理


定位错误信息

虽然全局异常让我们能把报错信息格式统一但是有一个很大的问题就是不会在控制台打印具体的错误栈信息,对查看日志修改bug有很大影响

为了解决这个问题我们需要在处理格式的同时把错误的栈信息打印出来

 @org.springframework.web.bind.annotation.ExceptionHandler(FirstException.class)
    public Object FirstExceptionHandler(FirstException firstException) {
        log.error("运行时异常,原因是{}", firstException.getErrorMessage());
        //打印错误的栈信息
        firstException.printStackTrace();
        return "自定义的返回体和返回内容";
    }

只需要增加这一行代码即可我们再次测试自定义的异常
前端返回值:
前端返回值
后端控制台打印内容:
后端控制台
这样就可以既把异常内容处理为统一格式又可以在后端保存错误信息的日志了


补充

printStackTrace()这个方法不能把日志打印到log文件里,为了线上用日志文件debug最好使用@sl4j这些日志文件的输出错误的方法

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值