全局异常处理
在SpringMVC中,提供了一个全局异常处理器,用于对系统中出现的异常进行统一处理。在一般的系统中,DAO层、Service层及Controller层出现异常都以“throws Exception”的形式向上层抛出,最后都会有SpringMVC的前端控制器(DispatcherServlet)统一交由全局异常处理器进行异常处理。
springmvc中自带的简单异常处理器
springmvc中自带了一个异常处理器叫SimpleMappingExceptionResolver,该处理器实现了HandlerExceptionResolver 接口,全局异常处理器都需要实现该接口。我们要使用这个自带的异常处理器,首先得在springmvc.xml文件中配置该处理器:
<!-- springmvc提供的简单异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<!-- 定义默认的异常处理页面 -->
<property name="defaultErrorView" value="/WEB-INF/jsp/error.jsp"/>
<!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception -->
<property name="exceptionAttribute" value="ex"/>
<!-- 定义需要特殊处理的异常,这是重要点 -->
<property name="exceptionMappings">
<props>
<prop key="ssm.exception.CustomException">/WEB-INF/jsp/custom_error.jsp</prop>
</props>
<!-- 还可以定义其他的自定义异常 -->
</property>
</bean>
自定义全局异常处理器实现HandlerExceptionResolver接口
使用实现 HandlerExceptionResolver 接口的异常处理器进行异常处理,具有集成简单、有良好的扩展性、对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提供更详细的异常处理信息。
- 定义一个类实现HandlerExceptionResolver接口
//1:实现接口
public class MyExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
//Exception e 表示由程序抛出来的异常
//返回值 为什么是 ModelAndView? 添加数据 再将数据显示在指定页面
ModelAndView mv = new ModelAndView();
mv.addObject("exception",e.getMessage());//添加异常信息
mv.setViewName("error");//指定一个显示错误的美观页面
return mv;
}
}
在springmvc.xml配置文件中注册
<!--2 注册 -->
<bean id="myExceptionResolver" class="com.wzx.web.exceptions.MyExceptionResolver"/>
或者:在上述的MyExceptionResolver类上加上@Component注解
@ControllerAdvice注解+@ExceptionHandler
新建一个处理异常的类,加上@ControllerAdvice注解
//标记当前类是用来处理异常的
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({ArithmeticException.class})
public String handleException(Exception e){
System.out.println("打印错误信息 ===> ArithmeticException:"+e);
//跳转到指定页面
return "error";
}
}
如果 @ExceptionHandler 注解中未声明要处理的异常类型,则默认为参数列表中的异常类型
。所以还可以写成这样:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler()
@ResponseBody
String handleException(Exception e){
return "Exception Deal! " + e.getMessage();
}
}
局部异常处理
使用 @ ExceptionHandler 注解
进行异常处理的方法必须与出错的方法在同一个Controller里面.如果针对Controller提供特有的异常处理就需要在Controller类下使用@ExceptionHandler(优先级高于全局配置
)如下所示
@Controller
public class GlobalController {
/**
* 用于处理异常的
* @return
*/
@ExceptionHandler({MyException.class})
public String exception(MyException e) {
System.out.println(e.getMessage());
e.printStackTrace();
return "exception";
}
@RequestMapping("test")
public void test() {
throw new MyException("出错了!");
}
}