Spring-MVC開發之全局異常捕獲全面解讀

異常,異常java

咱們必定要捕獲一切該死的異常,寧肯錯殺一千也不能放過一個!web

產品上線後的異常更要命,必定要屏蔽錯誤內容,以避免暴露敏感信息!spring

在用Spring MVC開發WEB應用時捕獲全局異常的方法基本有兩種,服務器

  1. WEB.XML,就是指定error-code和page到指定地址,這也是最傳統和常見的作法mvc

  2. 用Spring的全局異常捕獲功能,這種相對可操做性更強一些,可根據本身的須要作一後善後處理,好比日誌記錄等。app

SO,本文列出Spring-MVC作WEB開發時經常使用全局異常捕獲的幾種解決方案拋磚引玉ide

互相沒有依賴,每一個均可單獨使用!日誌

定義服務器錯誤WEB.XML整合Spring MVC

web.xmlcode

<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.xmlxml

<!-- 錯誤路徑和錯誤頁面,注意指定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全局異常,代碼入侵方式

異常拋出

@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全局異常,配置方式

異常拋出,同上!

異常捕獲

<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"/>

完!

相關文章
相關標籤/搜索