Java異常分類及同一處置詳解。本站提示廣大學習愛好者:(Java異常分類及同一處置詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Java異常分類及同一處置詳解正文
1、異常分類
java異常分為"檢討"和"非檢討"兩類,"檢討"二字的意思是,代碼編譯時,編譯器會去Check一下有無停止異常處置(捕捉或向上拋),關於歸類為須要檢討的異常,若沒處置,編譯就過不去。
初學的時刻,經常想為啥異常要如許分類處置? 後來明確了些,異常不外兩種:客觀和客不雅,一個年夜多半情形下可以免,一個年夜多半情形下沒法防止。
像NullPointerException這類異常,年夜多跟法式員本質掛鉤(開辟好,測試好, 根本不會在體系運轉後蹦出來), 根本是可以免的,java語法現在把它們對類為‘非檢討異常',也算給法式員和編譯器省了很多事;
而像IOException這類跟內在情況有關的異常,簡直是弗成防止的(指不定哪一天那一秒收集就掛了),然則當萍水相逢時,法式照樣要有所作為,所以編譯器有需要催促一下法式員,Check一下,看看是能否對這些能夠不期而至的異常停止了處置。當Exception對象傳遞到某個節點後,法式便可以履行一些辦法了,好比:給用戶前往一個提醒("體系忙碌,請重試"),給監控平台推送一個異常新聞等等。
2、異常的同一前往處置
1、容器處置
上面羅列Tomcat的處置方法,在web.xml下設置裝備擺設,按http前往碼或Exception類型來處置:
<error-page> <error-code>404</error-code> <location>/WEB-INF/views/error/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/WEB-INF/views/error/500.jsp</location> </error-page> <error-page> <exception-type>java.lang.Throwable</exception-type> <location>/WEB-INF/views/error/throwable.jsp</location> </error-page>
缺陷:沒法處置不須要前往html的要求,好比ajax;
2、框架處置
上面羅列Spring MVC的處置方法
(1)應用Spring MVC自帶的簡略異常處置器SimpleMappingExceptionResolver;
(2)完成接口HandlerExceptionResolver 自界說異常處置器; (建議應用,可支撐ajax等擴大)
(3)應用@ExceptionHandler注解完成異常處置;
第(1)種,在spring-mvc.xml下設置裝備擺設
<!-- 將Controller拋出的異常轉到特定視圖 --> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!-- 分歧異常離開跳轉--> <!-- 可以自界說分歧的異常--> <prop key="com.test.MyException1">/error/e1</prop> <prop key="com.test.MyException2">/error/e2</prop> <!-- 假如不想自界說異常,只設置裝備擺設上面的便可--> <prop key="java.lang.Throwable">/error/500</prop> </props> </property> </bean>
缺陷:沒法處置不須要前往html的要求;
第(2)種,自界說HandlerExceptionResolver接口的完成類
/** * 自界說異常處置器:支撐ajax * @author wangxu * */ public class MyExceptionHandler implements HandlerExceptionResolver { public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { /* 辨別ajax */ boolean isAjax = request.getHeader("X-Requested-With") != null && "XMLHttpRequest".equals(request .getHeader("X-Requested-With").toString()); if (!isAjax) { if (ex instanceof com.test.MyException1) { return new ModelAndView("/error/e1"); } else if (ex instanceof com.test.MyException1) { return new ModelAndView("/error/e2"); } else { return new ModelAndView("/error/500"); } } String jsonRes = "{\"message\":\"" + "體系異常" + "\"}";// 自界說構造和前台對接 PrintWriter out = null; try { out = response.getWriter(); request.setCharacterEncoding("utf-8"); response.setContentType("text/plain;charset=utf-8"); out.print(jsonRes); out.flush(); } catch (IOException e) { e.printStackTrace(); } finally { out.close(); } return null; } }
並在spring-mvc.xml下注冊處置器
<bean id="exceptionHandler" class="com.test.MyExceptionHandler"/>
長處:可以處置ajax要求,也便利編碼完成功效擴大,好比異常的監控等。
第(3)種,@ExceptionHandler注解
@Controller public class TestExceptionHandlerController { @ExceptionHandler({ MyException1.class }) public String exception(MyException1 e) { return "/error/e1"; } @RequestMapping("/marry") public void test() { throw new MyException1("沒錢!"); } }
缺陷:@ExceptionHandler的辦法,必需和能夠拋異常的辦法在一同個Controller下。(不建議應用)
3、聯合
現實項目中,在處置異常的同一前往時,會將一些自界說的異常或許擴大交給框架,將http前往碼的映照交給容器,由於http前往碼更外層,有些到不了框架,有些關於框架來講就不是一個異常(好比404之與Spring MVC)。框架是運轉在容器裡的,當框架優先拿到異常並做了前往處置,容器就不會再停止映照。
以上就是本文的全體內容,願望對年夜家的進修有所贊助。