提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
记录一下自定义全局异常的抛出和自定义异常的使用
提示:以下是本篇文章正文内容,下面案例可供参考
一、自定义异常是什么?
全局异常是对那些没有被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后我们再访问一次刚才那个接口可以在前端得到以下结果
而我们后端的日志中有以下内容:
除了自定义的异常外还可以对空指针异常和计算异常这些原生异常做一样的操作在刚才的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这些日志文件的输出错误的方法