基於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),在異常處理時不能獲取除異常之外的數據。 
相關文章
相關標籤/搜索