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
}
}
위와 같이 원시 람다를 사용하는 대신 함수를 사용하여 람다를 생성 할 수 있습니다 (그렇지 않으면 “MANY_LAMBDA_EXPRESSION_ARGUMENTS”및 기타 문제가 매우 빠르게 발생합니다). 같은 fun attempt(block: () -> Unit) = block
것이 작동합니다.
물론 논리를 더 우아하게 구성하거나 평범한 오래된 try-catch와 다르게 동작하기 위해 람다 대신 개체를 연결할 수 있습니다.
전문화를 추가하는 경우에만 miensol보다이 방법을 사용하는 것이 좋습니다 . 간단한 다중 캐치 사용의 경우 when
표현식이 가장 간단한 솔루션입니다.
답변
aro 의 예 는 매우 좋지만 상속이 있으면 Java 에서처럼 작동하지 않습니다.
귀하의 답변은 저에게 확장 기능을 작성하도록 영감을주었습니다. 상속 된 클래스도 허용하려면 instance
직접 비교 하는 대신 확인해야합니다 .
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
}}
사용 방법을 보려면 여기 GitHub의 내 라이브러리를 살펴 보세요.