程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java異常分類及同一處置詳解

Java異常分類及同一處置詳解

編輯:關於JAVA

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)。框架是運轉在容器裡的,當框架優先拿到異常並做了前往處置,容器就不會再停止映照。

以上就是本文的全體內容,願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved