본문 바로가기
Android 개발/Debug, ADB, CrashLytics, LogCat

Kotlin Exception 처리 방법 # RunCatching 과 try, catch

by Developer88 2020. 2. 13.
반응형

오늘은 Kotlin에서의 Exception처리에 대해서 정리해 보도록 하겠습니다.

Java에서는 Exception처리를 위해서 Try Catch문을 사용했었는데요.

Kotlin에서는 Try Catch 뿐만이 아니라, RunCatching API를 제공해 주고 있습니다.

오늘은 Kotlin의 Exception처리방법들인, Try Catch와 RunCatching에 대해서 정리해 보도록 하고 있습니다.

 

1. Classic한 Try와 Catch 그리고 finally

아래 이미지는 Java시절부터 사용해왔던 기본적인 try, catch 그리고 finally구조입니다.

Try는 Exception 발생할 수 있는 코드를 감싸는 블록이구요.
Catch는 Exception이 발생된 후 이를 핸들링 해주는 블록입니다.

Finally는 Exception발생과 상관없이 무조건적으로 실행되는 곳 이어서,

Exception이 나더라도 close되야 하는 리소스들을 처리해 주는데 주로 사용하지요.

 

 

 

Try블록에서 Exception이 발생할 경우 ,
Catch블록에서 해당하는 Exception처리가 되어 있다면, catch블록안의 코드가 동작해서,

앱은 Crash하지 않고, 다음 코드를 실행시켜 줍니다.

 

기존의 try, catch에 대한 기본적인 부분들을 정리해 보았는데요.

아래에서 Kotlin에서 사용할 수 있는 Exception 핸들링방법인 runCatching에 대해서 알아보겠습니다.

 

2. runCatching

runCatching은 코틀린 1.3버전에서 부터 제공하는 api인데요.

소스코드부터 가볍게 보고 가도록 하겠습니다.

인자로 block()함수를 받아서 Exception발생시에 catch해서 Result.failure()를 실행하는 군요.

 

 

반환 타입인 Result 클래스에 대해서도 잠깐 보고 가도록 하겠습니다.

 

 

2-1. runCatching 기본

이제 실제로 코드를 작성해 보겠습니다.

위에서 잠깐 보았던 try, catch 코드와 비교해 보시면 감이 좀 더 오실 것 같은데요.

catch에서 처리했던 익셉션 처리를 onFailure에서 하는 것이구요.

문제없이 성공했을 경우, onSuccess에서 값을 받아서 처리를 할 수 있습니다.

 

 

 

그러고 보니, try, catch문에서 사용하던  finally는 runCatching에서는 어떻게 할 수 있을까요?

모든 Exception이 다 onFailure로 가게 되어있으므로,

아래 코드와 같이 also를 사용하면 되겠습니다.

 

 

 

로그를 찍어보면 앱은 아래와 같이 also블록안의 코드가 실행된 것을 볼 수 있습니다.

 

 

2-2. Map, MapCatching, Recover, RecoverCatching

Kotlin에서는 좀 더 복잡한 케이스들을 위해서,

runCatching과 함께 사용할 수 있는 API들도 제공되고 있는데요.

성공한 값에 대해서 transform이 가능하도록 map과 mapCatching 그리고,

실패하고 받은 Exception에 대해서도 한번 더 가공이 가능하도록,

recover와 recoverCatching을 제공하고 있습니다.

 

map과 recover블록에서 Exception이 발생하면 runCatching블록 밖으로 exception이 나가버리므로,

try, catch로 잡아주던 해 주어야 되는데요.

mapCatching이나, recoverCatching을 이용하면,

Exception이 생기더라도, runCatching체인 메소드를 벗어나지 않고,

onFailure에서 핸들링 할 수 있습니다.

 

말이 조금 복잡한 것 같으니, 코드를 보도록 하겠습니다.

강제적으로 NullPointerException이 발생하도록 하였으므로,

recoverCatching을 거쳐서,

still good이 결과 값으로 나온 것을 볼 수 있습니다.

 

 

 

2-2. runCatching에 대한 return값이 필요할 경우

return값이 필요한 경우가 있을 텐데요.

이럴 때를 대비해서 몇가지 메소드들이 준비되어 있습니다.

바로 getOr로 시작하는 아래의 메소드들 입니다.

성공하지 못한 경우 Or뒷 부분이 값으로 전달되어 지거나, throw됩니다.

  • getOrNull: 실패할 경우 Null을 리턴
  • getOrDefault: 실패할 경우 인자로 전달한 값을 Default로 전달
  • getOrElse { }: 실패할 경우 Else블록을 실행
  • getOrThrow: 실패할 경우 익셉션을 Throw

아래 코드의 경우는 getOrDefault를 사용하였는데요.

 

 

3. 정리

이상으로 RunCatching을 사용한 코틀린의 Exception처리 방법에 대해서 정리해 보았는데요.

코틀린을 사용해야 하는 이유가 더욱 늘어나는 것 같습니다.

좀 더 좋은 방법이 있다면 이 글을 통해서 업데이트 하도록 하겠습니다.

 

728x90

댓글