一个Java web应用会出现一些莫名的运行时异常,可能是用户的操作不当,也有可能是程序本身的bug。所以一个程序中就会出现很多需要处理的异常,如果每个异常都需要捕获处理,或者直接抛出,都是不明智的处理方式。如果能够统一处理一些不能直接向用户抛出的异常,或者没有发现的异常,有选择性的抛出用户的操作异常,包装系统内部问题,降低糟糕的用户体验。
-
使用 @ExceptionHandler 注解
@ExceptionHandler注解的方法为处理异常的方法,须定义在需要处理异常的Controller
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ExceptionHandler { /** * 通过注解的方法处理异常,如果value的值为空,将会监听所有类型的异常 * 数组类型,可以指定多种类型的异常 */ Class<? extends Throwable>[] value() default {}; }
注解的作用对象为方法,并且运行时有效。该注解注释的方法可以具有灵活的输入参数:
- 异常参数
- 请求或响应对象:如ServletRequest/HttpServletRequest或PortleRequest/ActionRequest/RenderRequest
- Session对象:HttpSession或PortletSession
- WebRequest或NativeWebRequest
- Locale
- InputStream/Reader
- OutputStream/Writer
- Model
方法返回值可以为:
- ModelAndView对象
- Model对象
- Map对象
- View对象
- String对象
- 还有@ResponseBody、HttpEntity<?>或ResponseEntity<?>,以及void
-
使用 @ControllerAdvice 注解,定义统一处理异常的类
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface ControllerAdvice { @AliasFor("basePackages") String[] value() default {}; @AliasFor("value") String[] basePackages() default {}; Class<?>[] basePackageClasses() default {}; Class<?>[] assignableTypes() default {}; Class<? extends Annotation>[] annotations() default {}; }
注解作用对象为类、接口或枚举,在运行时有效,可以通过Spring扫描为bean组件。
注解可以捕捉到全局的异常,然后交由@ExceptionHandler注解的方法类处理异常
通过@ControllerAdvice + @ExceptionHandler 的方式即可实现统一处理异常的效果
@ControllerAdvice
public class ExceptionHandler {
@ResponseBody
@org.springframework.web.bind.annotation.ExceptionHandler
public String resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
//异常处理...
}
}
网友评论