过去,我们在开发接口时,如果发生了异常,为了给用户一个更友好的提示,比如说:
@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来处理方法中的异常,你可以在业务接口中安全地使用它们,而且你不再需要捕捉异常(有人统一处理它们)。真的很酷。