IT Share you

Kotlin에서 동시에 많은 예외를 포착하는 방법

shareyou 2021. 1. 8. 21:44
반응형

Kotlin에서 동시에 많은 예외를 포착하는 방법


try { 

} catch (ex: MyException1, MyException2 ) {
    logger.warn("", ex)
}

또는

try { 

} catch (ex: MyException1 | MyException2 ) {
    logger.warn("", ex)
}

결과적으로 컴파일 오류 : Unresolved reference: MyException2.

Kotlin에서 동시에 여러 예외를 포착하려면 어떻게해야하나요?


업데이트 : 이 기능을 Kotlin 에 적용하려면 다음 문제 KT-7128에 투표 하세요. 감사합니다 @Cristan

스레드 에 따르면 이 기능은 현재 지원되지 않습니다.

abreslav-JetBrains 팀

지금은 아니지만 테이블 위에 있습니다.

그래도 멀티 캐치를 모방 할 수 있습니다.

try {
    // do some work
} catch (ex: Exception) {
    when(ex) {
        is IllegalAccessException, is IndexOutOfBoundsException -> {
            // handle those above
        }
        else -> throw ex
    }
}

miensol 의 답변에 추가하려면 Kotlin의 멀티 캐치가 아직 지원되지 않지만 언급해야 할 대안이 더 있습니다.

외에도 try-catch-when다중 캐치를 모방하는 메서드를 구현할 수도 있습니다. 다음은 한 가지 옵션입니다.

fun (() -> Unit).catch(vararg exceptions: KClass<out Throwable>, catchBlock: (Throwable) -> Unit) {
    try { 
        this() 
    } catch (e: Throwable) {
        if (e::class in exceptions) catchBlock(e) else throw e
    }
}

그리고 그것을 사용하면 다음과 같이 보일 것입니다.

fun main(args: Array<String>) {
    // ...
    {
        println("Hello") // some code that could throw an exception

    }.catch(IOException::class, IllegalAccessException::class) {
        // Handle the exception
    }
}

You'll want to use a function to produce a lambda rather than using a raw lambda as shown above (otherwise you'll run into "MANY_LAMBDA_EXPRESSION_ARGUMENTS" and other issues pretty quickly). Something like fun attempt(block: () -> Unit) = block would work.

Of course, you may want to chain objects instead of lambdas for composing your logic more elegantly or to behave differently than a plain old try-catch.

I would only recommend using this approach over miensol's if you are adding some specialization. For simple multi-catch uses, a when expression is the simplest solution.


The example from aro is very good but if there are inheritances, it won't work like in Java.

Your answer inspired me to write an extension function for that. To also allow inherited classes you have to check for instance instead of comparing directly.

inline fun multiCatch(runThis: () -> Unit, catchBlock: (Throwable) -> Unit, vararg exceptions: KClass<out Throwable>) {
try {
    runThis()
} catch (exception: Exception) {
    val contains = exceptions.find {
        it.isInstance(exception)
    }
    if (contains != null) catchBlock(exception)
    else throw exception
}}

To see how to use, you can have a look in my library on GitHub here

ReferenceURL : https://stackoverflow.com/questions/36760489/how-to-catch-many-exceptions-at-the-same-time-in-kotlin

반응형