Sitemap

KotlinConf’25 期待的新功能 — Rich Errors

5 min readMay 30, 2025

--

Rich Errors 將在 Kotlin 2.4 推出 (Experimental 版)

Image by FantasyFan2014 from Pixabay

KotlinConf’25 已經順利結束,在本次的 Keynote 中,提到了多項會在 2.x 版推出的功能,各個功能都令人期待,有些甚至從 Kotlin 1.x 版就期待至今,本篇文章提到的 Rich Errors 就是即將在 2.4 版中一項重要的功能推進。

Rich Errors 就字面上的意思是「豐富的錯誤」,但實際上我認為他是將錯誤變得更具體,也就是在使用的時候,就能得知該函式會有什麼錯誤,在處理錯誤時,就能夠以更結構化的方式來處理錯誤,而不需要在每個函式都判斷其輸出值,或使用 try-catch 來攔截錯誤。換句話說,若在我們的呼叫串中,因為每個函式都有可能會爆出錯誤,使用 Rich Errors 的方式,就能避免針對每一個函式的錯誤進行處理。

從函式的呼叫來看,當我們不需要時時刻刻都擔心函式會有錯誤,我們就可以放心的編寫程式碼,並將錯誤的判斷集中在最後。

如下例,一個函式名為 fetchData(),而當網路沒有連線時,會拋出 NetworkError 錯誤。此時,呼叫該函式的地方,就必須考慮到沒有網路的情況,而在這邊是使用 try-catch 來處理。

object NetworkError : Exception("Network error occurred")

fun fetchData(): Data {
if (!Network.isConnected()) {
throw NetworkError
}

// connect network and fetch data
return data
}
main(){
try {
fetchData()
} catch(e: NetworkError){
//handle error case
}
}

Result

當然我們也可以使用 Result 來處理錯誤,如下:


fun fetchData(): Result<Data>{
if (!Network.isConnected()) {
return Result.failure(NetworkError)
}
//…
return Result.success(data)
}

main(){
val result = fetchData()

if (result.isFailure) {
println("Network error occurred")
} else {
val data = result.getOrNull()
// Process data
}
}

雖然使用 Result 能夠讓函式呼叫變得更直覺,不過若有多個函式呼叫就會面臨每個函式都需要判斷 Result 是否為 isSuccessisFailure 才能繼續執行,如此一來,程式碼也會變得癰腫。

Rich Errors

若是採用 Rich Errors 的方式,可以讓處理錯誤變得更簡潔,如下:
*以下內容尚未正式確定,現是以目前展示的寫法為範例*

使用步驟分為三步:
首先,使用 error定義錯誤。
第二步,使用 | 在函式的回傳值中定義可能發出的錯誤。
第三步,呼叫函式時,使用 when 來處理回傳值,而在這個過程中所有可能發生的錯誤,都需要在 when 裡面處理。

將上面範例使用 Rich Errors 的方式改寫,如下:


error object NetworkError: Exception(“Network error occurred”)
fun fetchDataWithRichErrors(): Data | NetworkError{
if (!Network.isConnected()) {
return NetworkError
}

return data
}

main(){
when(val data = fetchDataWithRichErrors()) {
is Data -> {
// Process data
}
is NetworkError -> {
println("Network error occurred")
}
}
}

而在連續的函式呼叫上,能夠將所有錯誤的集中在最後才一併處理,這樣的好處是只需要關注一個地方就可以將所有的情境處理完成,避免有錯誤沒處理到。

即將在 Kotlin 2.3 中推出的 Must-use Return values則是 Rich Error 的關鍵之一,當所有串連的函式呼叫都有包含錯誤時,最後的結果就需要處理所有的錯誤,使用 when 時,若是漏了錯誤沒處理,編譯器就會通知你,讓錯誤無處可逃。

小結

使用 Rich Errors 的方法可以讓處理錯誤更簡潔,且更有結構性。搭配 Must-use Return values的功能,更是能夠讓所有的錯誤都被處理,並且能夠將所有的錯誤集中在最後來處理。如此,我們就可以不需要花費太多力氣去處理錯誤,因為當錯誤沒有被處理,編譯器就會讓你無法繼續執行下去。

期待 Kotlin 2.4 版在暑假的到來,使用 Rich Errors 解放我們的程式碼吧!

--

--

Andy Lu
Andy Lu

Written by Andy Lu

Android/Flutter developer, Kotlin Expert, like to learn and share.

Responses (1)