Spring-MVC开发之全局异常捕获全面解读

在用Spring MVC开发WEB应用时捕获全局异常的方法基本有两种, java

  1. WEB.XML,就是指定error-code和page到指定地址,这也是最传统和常见的作法 web

  2. 用Spring的全局异常捕获功能,这种相对可操做性更强一些,可根据本身的须要作一后善后处理,好比日志记录等。 spring

SO,本文列出Spring-MVC作WEB开发时经常使用全局异常捕获的几种解决方案抛砖引玉 服务器

互相没有依赖,每一个均可单独使用! mvc

定义服务器错误WEB.XML整合Spring MVC

web.xml app

<error-page> <error-code>404</error-code> <location>/404</location> </error-page> <error-page> <error-code>500</error-code> <location>/500</location> </error-page> <!-- 未捕获的错误,一样可指定其它异常类,或自定义异常类 --> <error-page> <exception-type>java.lang.Exception</exception-type> <location>/uncaughtException</location> </error-page>

applicationContext.xml ide

<!-- 错误路径和错误页面,注意指定viewResolver --> <mvc:view-controller path="/404" view-name="404"/> <mvc:view-controller path="/500" view-name="500"/> <mvc:view-controller path="/uncaughtException" view-name="uncaughtException"/>

Spring全局异常,代码入侵方式

异常抛出 spa

@Controller public class MainController { @ResponseBody @RequestMapping("/") public String main(){ throw new NullPointerException("NullPointerException Test!"); } }

异常捕获 日志

//注意使用注解@ControllerAdvice做用域是全局Controller范围 //可应用到全部@RequestMapping类或方法上的@ExceptionHandler、@InitBinder、@ModelAttribute,在这里是@ExceptionHandler @ControllerAdvice public class AControllerAdvice { @ExceptionHandler(NullPointerException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody public String handleIOException(NullPointerException ex) { return ClassUtils.getShortName(ex.getClass()) + ex.getMessage(); } }

Spirng全局异常,配置方式

异常抛出,同上! code

异常捕获

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 默认错误页面,就是不在exceptionMappings指定范围内 --> <property name="defaultErrorView" value="uncaughtException" /> <property name="exceptionMappings"> <props> <!-- 异常类名,能够是全路径,错误页面或Controller路径! --> <prop key=".NullPointerException">NullPointerException</prop> <prop key="java.io.IOException">IOException</prop> </props> </property> </bean>

Sping全局异常,自定义异常类和异常解析

自定义异常类:

public class CustomException extends RuntimeException { public CustomException(){ super(); } public CustomException(String msg, Throwable cause){ super(msg, cause); //Do something... } }

抛出异常

@ResponseBody @RequestMapping("/ce") public String ce(CustomException e){ throw new CustomException("msg",e); }

实现异常捕获接口HandlerExceptionResolver

public class CustomHandlerExceptionResolver implements HandlerExceptionResolver{ @Override public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) { Map<String, Object> model = new HashMap<String, Object>(); model.put("e", e); //这里可根据不一样异常引发类作不一样处理方式,本例作不一样返回页面。 String viewName = ClassUtils.getShortName(e.getClass()); return new ModelAndView(viewName, model); } }

配置Spring支持异常捕获

<bean class="cn.bg.controller.CustomHandlerExceptionResolver"/>
相关文章
相关标签/搜索