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
'IT Share you' 카테고리의 다른 글
Java 및 기본 신뢰 저장소 사용 (0) | 2021.01.08 |
---|---|
mean, nanmean 및 warning : 빈 슬라이스의 평균 (0) | 2021.01.08 |
IE에서 콘텐츠를 자르는 고정 너비가있는 드롭 다운 선택 (0) | 2021.01.08 |
내 applicationContext에 여러 PropertyPlaceHolderConfigurer를 가질 수 있습니까? (0) | 2021.01.07 |
ByteArrayOutputStream을 닫아도 효과가 없습니까? (0) | 2021.01.07 |