Добавить в миенсол : хотя multi-catch в 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")
}.catch(IOException::class, IllegalAccessException::class) {
}
}
Вы захотите использовать функцию для создания лямбды, а не использовать исходную лямбду, как показано выше (в противном случае вы довольно быстро столкнетесь с "MANY_LAMBDA_EXPRESSION_ARGUMENTS" и другими проблемами). Что-то вроде fun attempt(block: () -> Unit) = block
бы сработало.
Конечно, вы можете захотеть связать объекты вместо лямбда-выражений, чтобы составить вашу логику более элегантно или вести себя иначе, чем простой старый try-catch.
Я бы рекомендовал использовать этот подход вместо 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)