SpringMVC全局異常處理的三種方式
在 JavaEE 項(xiàng)目的開(kāi)發(fā)中,不管是對(duì)底層的數(shù)據(jù)庫(kù)操作過(guò)程,還是業(yè)務(wù)層的處理過(guò)程,還是控制層的處理過(guò)程,都不可避免會(huì)遇到各種可預(yù)知的、不可預(yù)知的異常需要處理。每個(gè)過(guò)程都單獨(dú)處理異常,系統(tǒng)的代碼耦合度高,工作量大且不好統(tǒng)一,維護(hù)的工作量也很大。
SpringMvc 對(duì)于異常處理這塊提供了支持,通過(guò) SpringMvc 提供的全局異常處理機(jī)制,能夠?qū)⑺蓄?lèi)型的異常處理從各個(gè)處理過(guò)程解耦出來(lái),這樣既保證了相關(guān)處理過(guò)程的功能較單一,也實(shí)現(xiàn)了異常信息的統(tǒng)一處理和維護(hù)。
SpringMVC全局異常處理的三種方式
- 使用 Spring MVC 提供的簡(jiǎn)單異常處理器 SimpleMappingExceptionResolver;
- 實(shí)現(xiàn) Spring 的異常處理接口 HandlerExceptionResolver 自定義自己的異常處理器;
- 使用 @ExceptionHandler 注解實(shí)現(xiàn)異常處理;
案例實(shí)操
全局異常處理方式一
配置 SimpleMappingExceptionResolver 對(duì)象
<bean class="org.springframework.web.servlet.handler.SimpleMappingException Resolver">
<property name="defaultErrorView" value="error"></property>
<property name="exceptionAttribute" value="ex"></property>
<property name="exceptionMappings">
<props>
<prop key="com.xxx.exception.BusinessException">error1</prop>
<prop key="com.xxx.exception.ParamsException">error2</prop>
</props>
</property>
</bean>
全局異常處理方式二
實(shí)現(xiàn) HandlerExceptionResolver 接口
@Component
public class GlobalException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
Map<String,Object> map=new HashMap<String, Object>();
map.put("ex", ex);
ModelAndView mv=null;
if(ex instanceof ParamsException){
return new ModelAndView("error_param", map);
}
if(ex instanceof BusinessException){
return new ModelAndView("error_business", map);
}
return new ModelAndView("error", map);
}
}
使用實(shí)現(xiàn) HandlerExceptionResolver 接口的異常處理器進(jìn)行異常處理,具有集成簡(jiǎn)單、有良好的擴(kuò)展性、對(duì)已有代碼沒(méi)有入侵性等優(yōu)點(diǎn),同時(shí),在異常處理時(shí)能獲取導(dǎo)致出現(xiàn)異常的對(duì)象,有利于提供更詳細(xì)的異常處理信息。
全局異常處理方式三
頁(yè)面處理器繼承 BaseController
public class BaseController {
@ExceptionHandler
public String exc(HttpServletRequest request,HttpServletResponse
response,Exception ex){
request.setAttribute("ex", ex);
if(ex instanceof ParamsException){
return "error_param";
}
if(ex instanceof BusinessException){
return "error_business";
}
return "error";
}
}
使用 @ExceptionHandler 注解實(shí)現(xiàn)異常處理,具有集成簡(jiǎn)單、有擴(kuò)展性好(只需要將要異常處理的 Controller 類(lèi)繼承于 BaseController 即可)、不需要附加 Spring 配置等優(yōu)點(diǎn),但該方法對(duì)已有代碼存在入侵性(需要修改已有代碼,使相關(guān)類(lèi)繼承于 BaseController),在異常處理時(shí)不能獲取除異常以外的數(shù)據(jù)。
擴(kuò)展~未捕獲異常的處理
對(duì)于 Unchecked Exception 而言,由于代碼不強(qiáng)制捕獲,往往被忽略,如果運(yùn)行期產(chǎn)生了 Unchecked Exception,而代碼中又沒(méi)有進(jìn)行相應(yīng)的捕獲和處理,則我們可能不得不面對(duì)尷尬的 404、500……等服務(wù)器內(nèi)部錯(cuò)誤提示頁(yè)面。我們需要一個(gè)全面而有效的異常處理機(jī)制。目前大多數(shù)服務(wù)器也都支持在 Web.xml 中通過(guò) (Websphere/Weblogic) 或者 (Tomcat) 節(jié)點(diǎn)配置特定異常情況的顯示頁(yè)面。修改 web.xml 文件,增加以下內(nèi)容: java.lang.Throwable /500.jsp 500 /500.jsp 404 /404.jsp
以上就是SpringMVC全局異常處理的三種方式的詳細(xì)內(nèi)容,更多關(guān)于SpringMVC全局異常處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Spring Cloud 斷路器集群監(jiān)控(Turbine)
這篇文章主要介紹了詳解Spring Cloud 斷路器集群監(jiān)控(Turbine),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
javafx實(shí)現(xiàn)圖片3D翻轉(zhuǎn)效果方法實(shí)例
程序?qū)崿F(xiàn)思路: 在javafx中Node對(duì)象有一個(gè)effect屬性,可以用于實(shí)現(xiàn)各種特效。PerspectiveTransform特效可以使Node對(duì)象實(shí)現(xiàn)透視變換。因此我們可以通過(guò)計(jì)算透視變換中每個(gè)點(diǎn)的位置來(lái)實(shí)現(xiàn)3D翻轉(zhuǎn)特效。2013-04-04
SpringMVC實(shí)現(xiàn)controller中獲取session的實(shí)例代碼
本篇文章主要介紹了SpringMVC實(shí)現(xiàn)controller中獲取session的實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-02-02
詳解Java的堆內(nèi)存與棧內(nèi)存的存儲(chǔ)機(jī)制
這篇文章主要介紹了Java的堆內(nèi)存與棧內(nèi)存的存儲(chǔ)機(jī)制,包括JVM的內(nèi)存優(yōu)化和GC等相關(guān)方面內(nèi)容,需要的朋友可以參考下2016-01-01
使用mybatis報(bào)Invalid bound statement解決分析
這篇文章主要為大家介紹了使用mybatis報(bào)Invalid bound statement原因解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

