1. 程式人生 > >Java 異常分類及統一處理

Java 異常分類及統一處理

一、異常分類

java異常分為”檢查”和”非檢查”兩類,”檢查”二字的意思是,程式碼編譯時,編譯器會去Check一下有沒有進行異常處理(捕獲或向上拋),對於歸類為需要檢查的異常,若沒處理,編譯就過不去。

初學的時候,常常想為啥異常要這樣分類處理? 後來明白了些,異常不過兩種:主觀和客觀,一個大多數情況下可以避免,一個大多數情況下無法避免。

像NullPointerException這類異常,大多跟程式設計師素質掛鉤(開發好,測試好, 基本不會在系統執行後蹦出來), 基本是可以避免的,java語法當初把它們對類為‘非檢查異常’,也算給程式設計師和編譯器省了不少事。

而像IOException這類跟外在環境有關的異常,幾乎是不可避免的(指不定哪一天那一秒網路就掛了),但是當不期而遇時,程式還是要有所作為,所以編譯器有必要督促一下程式設計師,Check一下,看看是是否對這些可能不期而至的異常進行了處理。當Exception物件傳遞到某個節點後,程式就可以執行一些措施了,比如:給使用者返回一個提示(”系統繁忙,請重試”),給監控平臺推送一個異常訊息等等。

二、異常的統一返回處理

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 tangqing
 *
 */
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)。框架是執行在容器裡的,當框架優先拿到異常並做了返回處理,容器就不會再進行對映。

相關推薦

Java 異常分類統一處理(一)

一、異常分類 java異常分為”檢查”和”非檢查”兩類,”檢查”二字的意思是,程式碼編譯時,編譯器會去Check一下有沒有進行異常處理(捕獲或向上拋),對於歸類為需要檢查的異常,若沒處理,編譯就過不去。 初學的時候,常常想為啥異常要這樣分類處理? 後來明白了些,異常不過兩種:主觀和客觀,一個大多

Java 異常分類統一處理

一、異常分類 java異常分為”檢查”和”非檢查”兩類,”檢查”二字的意思是,程式碼編譯時,編譯器會去Check一下有沒有進行異常處理(捕獲或向上拋),對於歸類為需要檢查的異常,若沒處理,編譯就過不去。 初學的時候,常常想為啥異常要這樣分類處理? 後來明白了

Java 異常分類處理機制

 1. 引子        try…catch…finally恐怕是大家再熟悉不過的語句了,而且感覺用起來也是很簡單,邏輯上似乎也是很容易理解。不過,我親自體驗的“教訓”告訴我,這個東西可不是想象中的那麼簡單、聽話。不信?那你看看下面的程式碼,“猜猜”它執行後的結果會是什麼?

Java學習筆記05--強制型別轉換 ;內部類(瞭解即可) ;Java異常體系異常處理;iOS中的try catch 塊

===============java相關講解============= 強制型別轉換: 基本資料型別的轉換 小資料型別---->大的資料型別 自動型別轉換 大資料型別----->小資料型別 強制型別轉換

Java異常機制異常處理建議

1、Java異常機制        異常指不期而至的各種狀況,如:檔案找不到、網路連線失敗、非法引數等。異常是一個事件,它發生在程式執行期間,干擾了正常的指令流程。Java通過API中Throwable類的眾多子

Java異常型別處理

1.所有的異常都是從Throwable繼承而來的,是所有異常的共同祖先。 2.Throwable有兩個子類,Error和Exception。其中Error是錯誤,對於所有的編譯時期的錯誤以及系統錯誤都是通過Error丟擲的。這些錯誤表示故障發生於虛擬機器自身、或者發生在虛擬機器試圖執行

java執行中的異常資訊收集處理方法

這個程式會報錯Exception in thread "main" java.lang.NumberFormatException: For input string: "小王" at java.base/java.lang.NumberFormatException.for

java 異常分類處理機制

    一、背景介紹       程式在執行過程中發生錯誤或異常情況是不可避免的,如果每一個執行時錯誤都由程式設計師手動控制和處理,其工作量是不可想象的。     Java語言中的異常處理機制就解決的上述問題,把錯誤與異常的管理帶到了面向物件的世界Java語言定義了很多異常類

小程序異常監控錯誤處理

下載 數據監控 頁面加載 進一步 報錯 比較 路由 method 有一個 小程序異常監控收集 web端與小程序錯誤監控差異 在 Web 端監測的是頁面完整的 url,而小程序端監測的是路由地址; 小程序頁面屬於app內部的頁面,使用時已全部加載完畢,因此監控頁面性能時不統

Javaweb異常提示資訊統一處理

Java異常封裝(自己定義錯誤碼和描述,附原始碼) 2016年01月29日 22:30:54 小寶鴿 閱讀數:23262 標籤: java異常 更多 個人分類: Java基礎

Java異常知識整理_處理異常時的效能開銷

1.首先列兩個從別的地方看到的說法: try-catch程式碼段會產生額外的效能開銷,或者換個角度說,它往往會影響JVM對程式碼進行優化,所以建議僅捕獲有必要的程式碼段,儘量不要一個大的try包住整段的程式碼;與此同時,利用異常控制程式碼流程,也不是一個好主意,遠比我們通常意義上的條件語句(if/el

SpringMVC中的異常處理(全域性異常處理對自定義異常類進行統一處理)

前言: WEB開發中,總會有一些不可預料的錯誤,對於一些課預測的異常,我們可以自定義一個異常類,然後再載入個全域性異常處理器,對系統中出現的異常進行統一的處理。 注意:當你在Springmvc配置檔案中配置全域性異常處理器的時候,只要如下配置即可: <!

javaweb異常提示資訊統一處理(使用springmvc,附原始碼)

一、前言 後臺出現異常如何友好而又高效地回顯到前端呢?直接將一堆的錯誤資訊拋給使用者介面,顯然不合適。 先不考慮程式碼實現,我們希望是這樣的: (1)如果是頁面跳轉的請求,出現異常了,我們希望跳轉到一個異常顯示頁面,如下: 當然,這裡的介面不夠美觀,

Java 異常的捕獲與處理詳解(二)

上一篇Java 異常的捕獲與處理詳解(一)講了異常的產生、處理以及處理流程,接下來講其他內容。 一、throws關鍵字 thrwos關鍵字主要是在方法定義上使用的,表示的是此方法之中不進行異常的處理,而交給被呼叫處處理。 例如: class MyMath

Java異常分類(一)

Java 中的異常簡介 程式執行時,發生的不被期望的事件,它阻止了程式按照程式設計師的預期正常執行,這就是異常。 Java提供了更加優秀的解決辦法:異常處理機制。 Throwable類是Java異常型別的頂層父類,一個物件只有是 Throwable 類的(直接或者間接)

微信JSSDK接入Java版--步驟問題處理和解決

本人活躍在開源中國  部落格地址https://my.oschina.net/xshuai/blog/726459 微信JSSDKJava版接入--步驟及問題處理和解決 可以關注測試微訊號,檢視效果  伺服器是個人的。請不要惡意攻擊。 JSSDK使用步驟 http://

java異常分類

Java中異常的分類         所有異常,都繼承自java.lang.Throwable類。         Throwable有兩個直接子類,Error類和Exception類。Exception         Exception則可使從任何標準Java庫的類方法

Java 異常的捕獲與處理詳解(一)

一、異常的產生 異常是程式之中導致程式中斷的一種指令流,異常一旦出現並且沒有進行合理處理的話,那麼程式就將中斷執行。 下面,通過兩個程式來進行異常產生問題的對比。 (1)不產生異常的程式: public class Test { public s

java異常統一處理

出現 actor 錯誤 統一處理 type .get 。。 cfa getc 一般系統拋出的錯誤不含錯誤代碼,出去部分的404,500,400之外,我們如果想吧錯誤代碼定義的更細致,就需要自己繼承RuntimeExeption這個類後,重新定義構造方法定義自己的錯誤信息。

SpringBoot統一異常處理統一回復介面

SpringBoot及Mybait壞境搭建詳見上一篇 一.定義回覆介面格式類 package com.example.demo.bean; /* * * Created by Ay on 2018/9/20 */ //返回的格式類 public class ResultBean&l