基于Spring MVC的异常处理及日志管理

  1. Spring MVC处理异常有3种方式: 
  • 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver; 
  • 实现Spring的异常处理接口HandlerExceptionResolver 自定义本身的异常处理器; 
  • 使用@ExceptionHandler注解实现异常处理; 

 项目中才有第二种异常处理方式,我的比较推荐第二种和第三种实现方式。web

    2.    使用SimpleMappingExceptionResolver实现异常处理 spring

  • 在Spring的配置文件applicationContext.xml中增长如下内容:  

 

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  mvc

        <!-- 定义默认的异常处理页面,当该异常类型的注册时使用 -->  app

        <property name="defaultErrorView" value="error"></property>  url

        <!-- 定义异常处理页面用来获取异常信息的变量名,默认名为exception -->  spa

        <property name="exceptionAttribute" value="ex"></property>  xml

        <!-- 定义须要特殊处理的异常,用类名或彻底路径名做为key,异常也页名做为值 -->  对象

        <property name="exceptionMappings">  继承

            <props>  接口

                <prop key="cn.basttg.core.exception.BusinessException">error-business</prop>  

                <prop key="cn.basttg.core.exception.ParameterException">error-parameter</prop>  

                <!-- 这里还能够继续扩展对不一样异常类型的处理 -->  

            </props>  

        </property>  

</bean>  

  •  使用SimpleMappingExceptionResolver进行异常处理,具备集成简单、有良好的扩展性、对已有代码没有入侵性等优势,但该方法仅能获取到异常信息,若在出现异常时,对须要获取除异常之外的数据的状况不适用。 

3. 实现HandlerExceptionResolver 接口自定义异常处理器  

public class EmvcExceptionHandler implements HandlerExceptionResolver {
    private static Log log = LogFactory.getLog(EmvcExceptionHandler.class);

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) {
        String rurl = request.getServletPath();
        ModelAndView model = new ModelAndView();
        if (rurl.lastIndexOf(".do") > 0)
            model.setViewName("/commons/error/error");
        else {
            model.setViewName("/error");
        }

        //访问url
        String url = request.getServletPath();
        
        //访问的参数
        Enumeration enu = request.getParameterNames();
        StringBuffer params = new StringBuffer();
        while (enu.hasMoreElements()) {
            String paraName = (String) enu.nextElement();
            params.append(paraName + "=" + request.getParameter(paraName));
        }
        
        //描述信息
        String message =  exception.getMessage();
        
        //异常类型
        String exceptionType = exception.getClass().getName();
        
        //异常位置
        String position = null;
        ByteArrayOutputStream stackTrace = new ByteArrayOutputStream();
        exception.printStackTrace(new PrintStream(stackTrace));
        String content = stackTrace.toString();
        Pattern pat = Pattern.compile("com(.*)\\)");
        Matcher mat = pat.matcher(content);
        boolean rs = mat.find();
        if (rs) {
            position = mat.group(1);
        }
        position = "com"+position+")";
        
        XaskContext.getSystemData().saveExceptionLog(Arrays.asList(new ExceptionLog(url,params.toString(),message,exceptionType,position,new Date())));
        
        if ((exception instanceof XaskException)) {
            model.addObject("errorMsg", exception.getMessage());
            log.error(exception.getMessage());
            return model;
        }

        model.addObject("errorMsg", exception.getMessage());
        model.addObject("ex", exception);
        log.error("未处理异常", exception);
        return model;
    }
}

  • 在Spring的配置文件applicationContext.xml中增长如下内容:

    <bean id="exceptionHandler" class="cn.basttg.core.exception.MyExceptionHandler"/>

  • 使用实现HandlerExceptionResolver接口的异常处理器进行异常处理,具备集成简单、有良好的扩展性、对已有代码没有入侵性等优势,同时,在异常处理时能获取致使出现异常的对象,有利于提供更详细的异常处理信息。

4. 使用@ExceptionHandler注解实现异常处理 

  • 增长BaseController类,并在类中使用@ExceptionHandler注解声明异常处理,代码以下:

    @ExceptionHandler
    public String exp(HttpServletRequest request, Exception ex) {
        System.out.println("异常捕捉||||||"+ex.getClass() + "  ||||||======  " +ex.getMessage());
        request.setAttribute("ex", ex);
        // 根据不一样错误转向不一样页面
        if (ex instanceof ParameterException) {
            return "error-parameter";
        } else {
            return "error";
        }
    } 

  • 使全部须要异常处理的Controller都继承该类
  • 使用@ExceptionHandler注解实现异常处理,具备集成简单、有扩展性好(只须要将要异常处理的Controller类继承于BaseController便可)、不须要附加Spring配置等优势,但该方法对已有代码存在入侵性(须要修改已有代码,使相关类继承于BaseController),在异常处理时不能获取除异常之外的数据。 
相关文章
相关标签/搜索