Додайте до відповіді miensol : хоча мульти-улов у Котліні ще не підтримується, існує більше альтернатив, про які слід згадати.
Окрім 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")
}.catch(IOException::class, IllegalAccessException::class) {
}
}
Вам потрібно буде використовувати функцію для створення лямбда, а не використовувати необроблену лямбду, як показано вище (інакше досить швидко натрапите на "MANY_LAMBDA_EXPRESSION_ARGUMENTS" та інші проблеми). Щось на зразок fun attempt(block: () -> Unit) = block
спрацювало б.
Звичайно, ви можете захотіти об’єднати об’єкти замість лямбд, щоб скласти свою логіку більш елегантно або поводитися не так, як звичайна стара спроба.
Я рекомендував би використовувати цей підхід у порівнянні з miensol , лише якщо ви додаєте певну спеціалізацію . Для простих багатокористувацьких застосувань when
вираз є найпростішим рішенням.
pdvrieze
This certainly works, but is slightly less efficient as the caught exception is explicit to the jvm (so a non-processed exception will not be caught and rethrown which would be the corollary of your solution)