Kotlin標準庫 Result 簡介與應用
阿新 • • 發佈:2021-12-21
錯誤處理
程式設計,尤其是軟體工程中,如何處理錯誤是不可避免的,比較常見的有這幾種:
if(f() == null)
方式try {} catch(Exception) {}
方式Result<T>
方式
他們各有各自的優缺點
Kotlin Result<T>
Kotlin的Result<T>定義在Kotlin標準庫中,無需額外匯入庫,其原始碼在這裡可檢視 stdlib/src/kotlin/util/Result.kt
建立Result
常用Result作為函式返回值
直接建立
例:
// 如果成功,則返回OK123456,否則返回錯誤(及其Exception) fun f() { var f: Result<String> = Result.failure(Exception()) // 通過 failure 或 success 建立Result<T> var s: Result<String> = Result.success("OK123456") // 通過 failure 或 success 建立Result<T> return s }
從Try-Catch方法轉換
Result.runCatching函式可將Try-Catch方法轉換為Result
val y: Result<Int> = Result.runCatching {
throw Exception()
1
}
// y == Result.failure(Exception())
解析Result
更多的時候是獲得一個Result<T>,據其是success還是failure進行下一步操作,在這裡有很多方法
getOr系列函式
包括
result.getOrNull() //返回一個可空型別,若失敗則為空,否則為value,更適合喜歡 if(f() == null) 的人 result.getOrThrow() // 若失敗,則丟擲異常,更適合喜歡Exception方式的人 result.getOrDefault(defaultValue) // 若失敗,則返回defaultValue引數
通過isSuccess判斷 (不推薦)
這種方式適合喜歡 if(f() == null) 的人,注意getOrNull返回的仍然是可空型別
val result: Result<String> = f()
if(result.isSuccess) {
val x = result.getOrNull();
} else {
}
fold函式
fold函式可將錯誤處理的方式一併寫入,適合較為簡單的錯誤處理
val result: Result<String> = f() val x: String = result.fold( onSuccess = { "f() OK" }, onFailure = { "f() Failed" } ) println(x)
處理Result
可使用map函式在不取出Result值的情況下對Result進行變換
var s = Result.success("OK123456")
s = s.map { it.substring(1..3) }
// s == Result.success("K12")
其他函式
其他諸如 recover,mapCatching,getOrElse
之類的函式,只是上面幾種的變體
Copyright 2021 Winterreisender.
文字內容除另有宣告外,均在 知識共享 署名-非商業性使用-禁止演繹 4.0 國際 (CC BY-NC-ND 4.0)許可協議 下提供