今日感悟:越是厲害的人,程式碼越容易理解
問題:
- 請對比Exception和Error的區別,另外,執行時異常和一般異常有什麼區別?
知識點分析:
一. 首先來個簡單的類圖感受一下Throwable、Exception、Error的設計和分類:
從上圖中可以看出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部分原始碼
宣告:此為原創,轉載請聯絡作者
作者:微信公眾號新增公眾號-遛狗的程式設計師 ,或者可以掃描以下二維碼關注相關技術文章。
當然喜愛技術,樂於分享的你也可以可以新增作者微訊號: