1.全局异常
1.1使用SimpleMappingExceptionResolver
这种方式是处理全局异常,只要有对应的异常抛出,就会使用这个bean进行处理。使用SimpleMappingExceptionResolver
的话,只要在springmvc配置文件中做如下声明就可以了。
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<-- 默认的异常界面,如果不是特殊指定的异常,都显示这个界面 -->
<property name="defaultErrorView" value="/exception/handle/errorGlobal" />
<-- 异常的名称,界面上可以使用这个来输出异常信息 -->
<property name="exceptionAttribute" value="e" />
<-- 指定特殊异常,并为特殊异常指定特定的界面 -->
<property name="exceptionMappings">
<props>
<prop
key="xyz.zeling.exception.handle.modules.exception.handle.UserNotFoundException">/exception/handling/errorUser</prop>
</props>
</property>
</bean>
1.2继承于HandlerExceptionResolver
这个是全局异常,只要有对应的异常抛出,就会使用这个类进行处理。注意使用这种方式的话,需要使这个类成为bean,可以使用注解方式,也可以在spring配置文件中声明。这个例子使用的是注解的方式。
@Component
public class GlobalExceptionHandlerAnother implements HandlerExceptionResolver {
/**
* 异常处理方法,ex就是程序抛出的异常
*/
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
return new ModelAndView("/exception/handle/errorGlobal");
}
}
1.3使用@ControllerAdvice
这个也是全局异常,只要有对应的异常抛出,就会使用@ExceptionHandler
注解的方法进行处理,@ControllerAdvice
注解的类除了有处理异常的@ExceptionHandler
方法外,还有其它两个注解方法,感兴趣的同学可以自行研究。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception e) {
System.out.println("打印异常信息:");
e.printStackTrace();
return new ModelAndView("/exception/handling/errorGlobal");
}
}
2.局部处理异常
2.1使用@ResponseStatus注解自定义异常
@ResponseStatus
可以自定义返回状态码和提示信息。
使用方式,先自定义一个异常,并使用@ResponseStatus
注解
@ResponseStatus(
value = HttpStatus.BAD_REQUEST,
reason = "测试自定义返回码")
public class UserNotFoundException extends Exception {
private static final long serialVersionUID = -8695002135215307249L;
public UserNotFoundException(String name) {
super("User not found with name: " + name);
}
}
然后在你想抛出这个异常的地方进行抛出
if (user == null) {
throw new UserNotFoundException(name);
}
程序运行到这里之后,界面上就会返回一个自定义状态码和自定义提示信息。
PS:这个处理异常的方式会被@ControllerAdvice
处理方式覆盖掉,其它的全局处理异常会不会覆盖没测试过,如果有测过的同学麻烦帮忙评论告知。
2.2 Controller层里面使用@ExceptionHandler注解
这种方式处理的异常只针对于使用的那个Controller方法,使用方式:
@Controller
@RequestMapping("/exception/handling")
public class ExceptionHandleController {
@RequestMapping("/main")
public ModelAndView toMain() {
return new ModelAndView("/exception/handling/main");
}
/**
* @description TODO
* @date 2018年1月29日 下午11:50:58
* @param e 注解使用的异常,可以当作参数
* @return
* @throws Exception
*/
@ExceptionHandler(UserNotFoundException.class)
public ModelAndView handleException(UserNotFoundException e) {
// 异常处理逻辑
// ...
return new ModelAndView("/exception/handling/errorUser");
}
}
结语
有错误的地方麻烦评论指正一下哈,共勉。