π£ runCatching μ try-catch λ₯Ό λ체ν μ μλ μ½νλ¦°μ λ¬Έλ²μ΄λ€.
Β
try-catch λ¬Έμ μ€ν¨μμ νΈλ€λ§μ μ²λ¦¬ν μ μμλ€λ©΄,
runCatching μ μ±κ³΅, μ€ν¨μ λ λ€ μ²λ¦¬ ν μ μλ€.
@InlineOnly
@SinceKotlin("1.3")
public inline fun <T, R> T.runCatching(block: T.() -> R): Result<R> {
return try {
Result.success(block())
} catch (e: Throwable) {
Result.failure(e)
}
}
보λ€μνΌ, λ¦¬ν΄ νμ μ Result λΌλ κ°μ²΄μ΄λ©°,Β
μ λ¬λ°μ λ΄μ©μ μ€νν΄μ,Β
μ±κ³΅νλ€λ©΄ Result.success()
λ₯Ό ν΅ν΄ μ±κ³΅νλ€λ λ΄μ©μ λ΄μ Result κ°μ²΄,
μ€ν¨νλ€λ©΄ Result.failure()
λ₯Ό ν΅ν΄ μλ¬ λ΄μ©μ λ΄μ Result κ°μ²΄λ₯Ό λ°ννλ€.
runCatching { }
: μ€κ΄νΈ μμ try νκ³ μ νλ ꡬ문μ μμ±
onSuccess { }
: μ runCatch κ΅¬λ¬Έμ΄ μ±κ³΅μ 맀νν ꡬ문μ μμ±. it μ μ ꡬ문μ κ²°κ³Ό.
onFailure { }
: μ runCatch κ΅¬λ¬Έμ΄ μ€ν¨μ 맀νν ꡬ문μ μμ±. it μ μ ꡬ문μμ λμ§ Throwable κ°μ²΄.
also { }
: κΈ°μ‘΄ try-catch-finally μμ finally μμ μμ±νλ ꡬ문μ μμ±ν μ μμ.
볡μ‘ν μν©
map { }
: μ±κ³΅ν κ°μ λν΄ νλ²λ κ°κ³΅μ΄ κ°λ₯. μ¬κΈ°μ μμΈκ° λ°μνλ©΄ runCatching ꡬ문 λ°μΌλ‘ μμΈλ₯Ό λμ§.
mapCatching { }
: μ±κ³΅ν κ°μ λν΄ νλ²λ κ°κ³΅μ΄ κ°λ₯. μ¬κΈ°μ μμΈκ° λ°μνλ©΄ runCatching ꡬ문 λ°μΌλ‘ μμΈλ₯Ό λμ§μ§ μκ³ , κ·Έ μμΈλ₯Ό λ΄μ Result κ°μ²΄ λ°ν. μ΄ν onFailure λ±μΌλ‘ λ€μ μ‘μμ μ²λ¦¬κ°λ₯.
recover { }
: μ€ν¨ν κ°μ λν΄ νλ²λ νΈλ€λ§μ΄ κ°λ₯. μ¬κΈ°μ μμΈκ° λ°μνλ©΄ runCatching ꡬ문 λ°μΌλ‘ μμΈλ₯Ό λμ§.
recoverCatching { }
:μ€ν¨ν κ°μ λν΄ νλ²λ νΈλ€λ§μ΄ κ°λ₯. μ¬κΈ°μ μμΈκ° λ°μνλ©΄ runCatching ꡬ문 λ°μΌλ‘ μμΈλ₯Ό λμ§μ§ μκ³ , κ·Έ μμΈλ₯Ό λ΄μ Result κ°μ²΄ λ°ν. μ΄ν onFailure λ±μΌλ‘ λ€μ μ‘μμ μ²λ¦¬κ°λ₯.
runCatching ꡬ문μ return κ°μ΄ νμν λ
getOrNull()
: μμμ λ°νλ Result κ°μ²΄κ° μ±κ³΅κ°μ²΄ μΌ λ κ° λ°ν. μ€ν¨λ©΄ null
getOrDefault(~)
: μμμ λ°νλ Result κ°μ²΄κ° μ±κ³΅κ°μ²΄ μΌ λ κ° λ°ν. μ€ν¨λ©΄ λ€μ μ μν κ° λ°ν.
getOrThrow()
: μμμ λ°νλ Result κ°μ²΄κ° μ±κ³΅κ°μ²΄ μΌ λ κ° λ°ν. μ€ν¨λ©΄ Result κ°μ²΄μ μμΈ throw.
getOrElse { }
: μμμ λ°νλ Result κ°μ²΄κ° μ±κ³΅κ°μ²΄ μΌ λ κ° λ°ν. μ€ν¨λ©΄ λ€μ μ μν ꡬ문 μ€ν.
Result κ°μ²΄λ ν¨μμ λ°ννμΌλ‘ μ°μΌ μ μλ€.
Result<T>.getOrThrow(): T
Result<T>.getOrElse(onFailure: (exception: Throwable) -> R): R
Result<T>.getOrDefault(defaultValue: R): R
Result<T>.onSuccess(action: (value: T) -> Unit): Result<T>
Result<T>.onFailure(action: (exception: Throwable) -> Unit): Result<T>
Result<T>.fold(
onSuccess: (value: T) -> R,
onFailure: (exception: Throwable) -> R
): R
Result<T>.map(transform: (value: T) -> R): Result<R>
Result<T>.mapCatching(transform: (value: T) -> R): Result<R>
Result<T>.recover(transform: (exception: Throwable) -> R): Result<R>
Result<T>.recoverCatching(transform: (exception: Throwable) -> R): Result<R>
runCatching {
doing...
}.fold({
// μ±κ³΅μλ§ μ€ν
},{
// μ€ν¨μλ§ μ€ν
})
var fruitName: String? = null
// μ€ν¨ μ default κ°μ λ°ν
fruitName = fruitResult.getOrDefault("")
// μ€ν¨ μ else blockμ κ²°κ΄κ°μ λ°ν
fruitName = fruitResult.getOrElse {
when(it) {
is IllegalStateException -> "Sold out"
is NullPointerException -> "null"
else -> throw it
}
}
// μ€ν¨μ throwableμ΄ λ€μ throw
fruitName = fruitResult.getOrThrow()
// map, recoverμ μ΄μ©ν΄ μ±κ³΅κ³Ό μ€ν¨ μ μνλ κ°μΌλ‘ λ°κΏ μ μμ
fruitResult.map {
it.toUpperCase()
}
// Exception λ³λ‘ λ€μ νλ² λ νΈλ€λ§μ΄ κ°λ₯
fruitResult.recover {
when(it) {
is IllegalStateException -> "Sold out"
is NullPointerException -> "null"
else -> throw it
}
}
μ°Έκ³ μλ£