HTTP 200 OK

Memento mori & Carpe diem

Kotlin

Run Catching

sjoongh 2023. 3. 1. 16:48

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 객체가 성공객체 일 때 값 반환(실패 -> 뒤에 정의한 구문 실행)

 

활용

  1. Result를 이해하면, MSA환경에서 에러가 전파되지 않도록 막을 수 있다.
  2. 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