过去,在开发接口时,如果发生异常,我们通常需要给用户一个更友好的提示。但如果不进行错误处理,例如:

@RequestMapping("/test")
@RestController
public class TestController {
    @GetMapping("/division")
    public String division(@RequestParam("a") int a, @RequestParam("b")int b) {
        return String.valueOf(a / b);
    }
}

这是一个计算 a/b 结果的方法,通过127.0.0.1:8080/test/division?a=10&b=0 访问后会出现以下结果:
2025-08-12T09:47:10.png

什么?用户能直接看到如此详细的错误信息吗?

这种报错方式给用户带来了非常糟糕的体验。为了解决这个问题,我们通常在接口中捕获异常。

@GetMapping("/division")
public String division(@RequestParam("a") int a, @RequestParam("b") int b) {
    String result = "";
    try {
        result = String.valueOf(a / b);
    } catch (ArithmeticException e) {
        result = "params error";
    }
    return result;
}

接口改造后,当发生异常时,会提示:“params error”,用户体验会更好。
如果只是一个接口,那没问题。但如果项目中有成百上千个接口,我们是否需要为所有接口添加异常处理代码呢?
肯定不能这样做的。这时,全局异常处理就派上用场了:RestControllerAdvice

@RestControllerAdvice
publicclass GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public String handleException(Exception e) {
        if (e instanceof ArithmeticException) {
            return"params error";
        }
        if (e instanceof Exception) {
            return"Internal server exception";
        }
        returnnull;
    }
}

只需在 handleException 方法中处理异常情况。业务接口可以放心使用,不再需要捕获异常(遵循统一的处理逻辑)。

最后修改:2025 年 08 月 13 日
个人博客