我们编写的Web程序,在运行过程中难免会遇到许多不同的异常。这么多异常如何处理起来比较合理呢?应该是放在一个统一处理异常的地方,这样不但能保持代码清爽,而且对异常的管理会方便。
学习解决异常时,通常有两种办法:
- 使用
try...catch
,用try
包裹住执行的代码,异常交给catch
捕获。 - 直接使用
throw
将异常丢出去。
使用第一种方法解决异常会有一个问题,如同样的一个异常A
,在多个地方:Controller
、Service
、Dao
都出现了,要处理异常我们就需要在多个地方写try...catch
,不太好。
使用第二种方法,将异常抛出去,但总归还是得有个地方去解决吧,因为Controller在服务器的三层架构中的是属于最上的(靠近用户),所以我们可以将所有的异常都抛到Controller这一层去解决,而Spring给我们提供了在这一层的AOP
方法,这种方法叫:@ControllerAdvice
,它可以配合@ExceptionHandler
帮助我们统一的处理异常。
编写统一的异常处理类
我们需要做的事情非常简单,直接定义一个处理异常的类:ExceptionHandler
public class ExceptionHandler {
}
然后在这个类上加上@ControllerAdvice
注解,表示它是给Controller加强的。
@ControllerAdvice
public class ExceptionHandler {
}
接下去我们需要编写拦截什么异常进行处理,需要用到@ExceptionHandler
,它的value值传入处理异常的类。
@ControllerAdvice
public class ExceptionHandler {
@ExceptionHandler(RuntimeException.class)
// 拦截到后执行的方法
}
比如说这里拦截到RuntimeException.class
异常,拦截到后需要执行一些特定的方法
@ControllerAdvice
public class ExceptionHandler {
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public String handleRuntimeException(RuntimeException e) {
e.printStackTrace();
// 返回 error 就相当于跳转到 error.jsp 页面。
return "error";
}
}
这里做了两件事情:
- 打印了一下错误信息。
- 会将"error",作为响应体数据返回。(因为用了
@ResponseBody
)
自定义异常
我们还可以自定义异常,然后被捕获(被捕获的前提就是,你在分析代码可能出错的地方将错误通过throw
抛出)
而自定义异常非常简单,只需要继承Exception
类即可。