Aby dodać do odpowiedzi miensol : chociaż multi-catch w Kotlinie nie jest jeszcze obsługiwany, istnieje więcej alternatyw, o których należy wspomnieć.
Oprócz tego try-catch-whenmożna również zaimplementować metodę naśladowania wielokrotnego przechwytywania. Oto jedna opcja:
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
}
}
A użycie tego wyglądałoby tak:
fun main(args: Array<String>) {
{
println("Hello")
}.catch(IOException::class, IllegalAccessException::class) {
}
}
Będziesz chciał użyć funkcji do wytworzenia lambda zamiast używać surowej lambdy, jak pokazano powyżej (w przeciwnym razie dość szybko napotkasz „MANY_LAMBDA_EXPRESSION_ARGUMENTS” i inne problemy). Coś takiego fun attempt(block: () -> Unit) = blockmogłoby zadziałać.
Oczywiście możesz chcieć łączyć obiekty zamiast lambd, aby skomponować swoją logikę bardziej elegancko lub zachowywać się inaczej niż zwykły stary try-catch.
Zalecałbym używanie tego podejścia zamiast miensol , jeśli dodajesz jakąś specjalizację . W przypadku prostych zastosowań typu multi-catch whennajprostszym rozwiązaniem jest wyrażenie.
pdvriezeodpowiedź tutaj: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)