1. 程式人生 > 其它 >Kotlin標準庫 Result 簡介與應用

Kotlin標準庫 Result 簡介與應用

錯誤處理

程式設計,尤其是軟體工程中,如何處理錯誤是不可避免的,比較常見的有這幾種:

  • 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)許可協議 下提供