Exception和Error的理解

遛狗的程式設計師發表於2018-07-26

今日感悟:越是厲害的人,程式碼越容易理解

問題:

  • 請對比Exception和Error的區別,另外,執行時異常和一般異常有什麼區別?

知識點分析:

一. 首先來個簡單的類圖感受一下Throwable、Exception、Error的設計和分類:

image
從上圖中可以看出Exception和Error都是繼承Throwable,也就是中Java中只有Throwable型別的例項才可以被丟擲(Throw)或者捕獲(catch)。

二. 掌握最基本的語法。如try-catch-finally塊、throw、throws關鍵字等。同時懂得如何處理典型場景。

知識點補充:

隨著Java語言的擴充套件,引入了一些更加便利的特性,try-with-resources和multiple catch。具體我這裡引用了RxJava和Retorfit結合原始碼的一段。在編譯時期,會自動生成相應的處理邏輯,比如:自定義AutoCloseable實現(AutoCloseable不瞭解的可以參考文章Java7中的Try-with-resources

//程式碼路徑:
package retrofit2.adapter.rxjava2.CallExecuteObservable

@Override protected void subscribeActual(Observer<? super Response<T>> observer) {
   //省略邏輯
   ...
   
    try {
    //劃重點了,這裡沒有貼程式碼,感興趣自己調式execute方法 
      Response<T> response = call.execute();
      if (!disposable.isDisposed()) {
        observer.onNext(response);
      }
      if (!disposable.isDisposed()) {
        terminated = true;
        observer.onComplete();
      }
    } catch (Throwable t) {
    //劃重點了,跟隨優秀的開源框架一步步進去,你會發現它遵循了:
    //1.儘量捕獲具體異常,不要捕獲Throable或者Error //2.不生吞(swallow)異常
    //3.throw early
    //4.僅僅捕獲必要程式碼塊,try-catch會產生額外的效能開銷
      Exceptions.throwIfFatal(t);
      if (terminated) {
        RxJavaPlugins.onError(t);
      } else if (!disposable.isDisposed()) {
        try {
          observer.onError(t);
        } catch (Throwable inner) {
          Exceptions.throwIfFatal(inner);
          RxJavaPlugins.onError(new CompositeException(t, inner));
        }
      }
    }
  }
複製程式碼

回答問題:

這邊就不寫了,根據上面類圖和文字補充,各自組織語言吧(重要的是自己要有深度思考能力)

參考:http://ifeve.com/java-7%E4%B8%AD%E7%9A%84try-with-resources/ ,極客時間APP核心技術第二講|Exception和Error有什麼區別、retrofit2.adapter.rxjava2部分原始碼

宣告:此為原創,轉載請聯絡作者


作者:微信公眾號新增公眾號-遛狗的程式設計師 ,或者可以掃描以下二維碼關注相關技術文章。

qrcode_for_gh_1ba0785324d6_430.jpg
當然喜愛技術,樂於分享的你也可以可以新增作者微訊號:

WXCD.jpeg

相關文章