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)。框架是運轉在容器裡的,當框架優先拿到異常並做了前往處置,容器就不會再停止映照。
以上就是本文的全體內容,願望對年夜家的進修有所贊助。