Run Catching란?
- runCatching 은 try-catch 를 대체할 수 있는 코틀린의 문법이다.
- try-catch 문은 실패시의 핸들링을 처리할 수 있었다면, runCatching 은 성공시, 실패시 둘 다 처리할 수 있다.
기본 문법
- 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를 이해하면, MSA환경에서 에러가 전파되지 않도록 막을 수 있다.
- runCatching과 Result를 사용하면 에러 핸들링을 클라이언트에게 위임할 수 있다.
예제
try … catch
// Basic Code
runCatching {
k ?: throw NullPointerException("k is null")
}.onSuccess {
Log.d(TAG, "k: $it")
}.onFailure {e ->
e.printStackTrace()
}
runCatching
// Basic + finally 구문 처리
runCatching {
k ?: throw NullPointerException("k is null")
}.onSuccess {
Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
}.onFailure {e ->
Log.d(TAG, "catch exception")
e.printStackTrace()
}.also { // also가 finally역할을 담당 -> 모든 exception이 onFailure로 오게 되어있으므로
Log.d(TAG, "do finally here")
Log.d(TAG, "result: ${it.isFailure}")
}
결론
Result(runCatching)는 다음의 용도에서 사용할 수 있다.
- 외부 서비스에 의존하는 로직이라 예외 발생 가능성이 빈번한 컴포넌트
- 해당 컴포넌트에서 에러가 발생할 수 있다는 것을 클라이언트에게 알려주고 싶을 때, 에러 핸들링을 다른 컴포넌트에 강제하고 위임하고 싶을 때
- try … catch를 쓰고 싶지 않을 때
'Kotlin' 카테고리의 다른 글
JSON 직렬화가 왜 안돼?.. (1) | 2024.11.24 |
---|---|
[Kotlin] Result란? (0) | 2023.09.12 |
[Kotlin] Error Handling (0) | 2023.08.26 |
[Kotlin] 기초 (0) | 2022.08.01 |