try {
} catch (ex: MyException1, MyException2 ) {
logger.warn("", ex)
}
или же
try {
} catch (ex: MyException1 | MyException2 ) {
logger.warn("", ex)
}
В результате ошибка компиляции: Unresolved reference: MyException2
.
Как я могу поймать много исключений одновременно на Kotlin?
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)
else
повторно генерирует нежелательное исключение.Добавить в миенсол : хотя 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") // 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
простейшим решением является выражение.источник
exceptions
принимает объекты.Пример от 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 здесь
источник