runCatching 블록 안에서 성공/실패 여부가 캡슐화된 Result<T> 형태로 리턴합니다.
val colorName: Result<String> = runCatching {
when (color) {
Color.BLUE -> "파란색"
Color.RED -> "빨간색"
Color.YELLOW -> "노란색"
Color.ARMARNTH -> throw Error("처음 들어보는 색")
}
}.onSuccess { it:String ->
//성공시만 실행
}.onFailure { it:Throwable ->
//실패시만 실행 (try - catch문의 catch와 유사)
}
Result<T>타입은 isSuccess와 isFailure를 프로퍼티로 갖습니다.
feature("Repository Test") {
val repository = MockRepository()
val dummyUser = SampleHleper.dummyUser()
scenario("should be able to insert a user In Repo") {
val result = runCatching {
runBlocking { repository.insert(dummyUser) }
}
result.isSuccess shouldBe true
}
}
colorName.getOrThrow()
// runBlocking문에서 에러가 발생한경우 해당에러를 리턴합니다.
colorName.getOrDefault(defaultValue = "미상")
//runBlocking문에서 에러가 발생한경우 defaultValue 파라미터를 리턴합니다.
colorName.getOrNull()
// runBlock문에서 에러가 발생한경우 null값을 리턴합니다.
colorName.getOrElse{ exception: Throwable ->
}
// runBlocking문에서 에러가 발생한경우 exception을 인자로받아
// 블록안의 값을 리턴합니다.캡슐화된 타입값과 같아야하기때문에 다른타입을
// 리턴하고싶다면 아래 mapCatching을 사용해야합니다.
val firstUserAge: Result<Int> = runCatching {
"123"
}.map { it: String ->
it.toInt()
}
val secondUserAge: Result<Int> = runCatching {
"123"
}.mapCatching { it: String ->
it.toInt()
}
try {
runCatching {
database.getUser(id)
}.map { user: User? ->
//강제로 에러를 발생시킵니다.
throw Error("유저정보를 가져올 수 없습니다.")
}.onSuccess {
//map 블록에서 에러 발생시 실행되지않습니다.
}.onFailure {
//map 블록에서 에러 발생시 실행되지 않습니다.
}
} catch (e:Exception) {
//map 블록에서 발생한 에러를 인자로받아 호출됩니다.
}
runCatching {
database.getUser(id)
}.mapCatching { user: User? ->
//강제로 에러를 발생시킵니다.
throw Error("유저정보를 가져올 수 없습니다.")
}.onSuccess {
//mapCatching 블록에서 에러 발생시 실행되지않습니다.
}.onFailure {
//mapCatching 블록에서 에러 발생시 호출됩니다.
}
map이 runCatching이 성공할 경우 호출되었다면 recover은 실패했을 경우 호출됩니다.
try {
runCatching {
throw Error("runBlock문 에러발생")
}.recover { it: String ->
throw Error("recover문 에러발생")
}.onFailure {
//에러가 전달되지않습니다.
}
} catch (e: Exception) {
//recover에서 발생한 에러가 받아집니다.
}
runCatching {
throw Error("runBlock문 에러발생")
}.recoverCatching { it: String ->
throw Error("recover문 에러발생")
}.onFailure {
//이곳에서 에러를 받습니다.
}