我多年忽略了 Java RuntimeException 觀念
最近寫 Java 發現某個 MyBatis API 報錯,文件沒有寫會丟 Exception
,但是 MyBatis DB 發生錯誤就會丟…,後來發現是我當出沒看好,所以趕快記錄一下。
文章重點取自 Java筆記 — Exception 與 Error. 這是個很老梗的問題了, 但每個階段回來看, 都會有不同的體會… | by Carl | Medium,建議看大神文章,可以呼略下面筆記。 備份圖
Java 錯誤種類
Exception: 通常指程式運行時所出現的可預料之意外狀況, 基本上都要進行 catch 的動作, 然後進行相應處理, 如 IOException.
Error: 指在正常情況下, 不太可能出現的問題, 絕大部分的 Error 都會導致程式 (e.g. JVM 本身) 處於一種不正常且不可恢復的狀態. 所以對於這種情況, 你也不太需要去 catch 了, 因為也沒什麼意義. 常見的如 OutOfMemoryError / StackOverflowError 這些, 都是繼承自 Error.
Java Exception(重點)
Checked Exception: 又稱受檢例外, 通常在原始碼中必須顯式地 catch 並且處理, 這部分算是 compile time 會檢查的部分.
Unchecked Exception: 又稱非受檢例外, 就是所謂的 RuntimeException, 常見的像是 NullPointerException, ArrayIndexOutOfBoundsException. 這種類型的例外通常是可以透過撰寫相應程式以避免的邏輯錯誤, 可以根據當下的情境來判斷是不是要 catch, 且在 compile time 並不會強制要求要 catch.
原因出在 RuntimeException
這邊RuntimeException
程式執行時候才會丟 Exception ,這邊就要想想什麼時候要做 Exception ,說真的目前遇到公司都會丟 throw Exception
(這邊是公司底層 Dao 都會丟 Exception),編輯器都會跟你說要add throw Exception 到 method
,因為丟會防止程式問題,要怎麼處理 RuntimeException 這是一個好問題,有時間再整理。
相關 RuntimeException 文章
日常接觸 Exception 處理
Spring Boot Transactional
我常常在工作中會把 Spring Boot Transactional 交易改成Exception
,公司底層也是這樣寫,是因為怕程式錯誤沒有 rollback 會造成這樣,但我想最正確寫法。
- Hibernate 和 Spring Boot JPA 做 @Transactional 不一樣 session.close 時機 | 程式狂想筆記
- Spring 交易事務失效 | 程式狂想筆記
- 詳細瞭解 Spring Transaction 的 Propagation 備份圖
感想
大概看了一些文章,處理 DB 應該不需要處理RuntimeException
,也應該不需要 Excepion
,也許你改成Exception
時候代表程式沒有寫好(程式單一原則),不該把Runtime Exception
程式碼放在裡面。
我目前看到結果大概是這樣,有問題再補。
題外話,其實幾個月前我就有打算整理這篇,最近學 Lamdba 遇到 Exception 問題,所以想到這個還沒有整理,之後還要整理 Lamdba 怎麼處理 Exception 問題。