SpringBoot中的​​​​​​​全局异常处理


过去,我们在开发接口时,如果发生了异常,为了给用户一个更友好的提示,比如说:

@RequestMapping("/test")
@RestController
public class TestController {

    @GetMapping(
"/add")
    public String add() {
        int a = 10 / 0;
        return
"su";
    }
}

如果你不做任何处理来请求添加接口结果,将直接报告错误。

用户可以直接看到错误信息吗?

这种交互方式给用户的体验非常差。为了解决这个问题,我们通常会在接口中捕捉异常。

@GetMapping("/add")
public String add() {
    String result =
"success";
    try {
        int a = 10 / 0;
    } catch (Exception e) {
        result =
"error";
    }
    return result;
}

接口修改后,当异常发生时,会提示。"数据异常",这样更方便用户使用。

这看起来很不错,但有一个问题。

如果只是一个接口还可以,但如果项目中有成百上千个接口,是不是要增加捕捉异常的代码?

答案是否定的,这就是全局异常处理的用武之地:RestControllerAdvice

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        if (e instanceof ArithmeticException) {
            return "data error";
        }
        if (e instanceof Exception) {
            return
"service error";
        }
        retur null;
    }
}

你只需要handleException来处理方法中的异常,你可以在业务接口中安全地使用它们,而且你不再需要捕捉异常(有人统一处理它们)。真的很酷。