Um die Antwort von miensol zu ergänzen : Obwohl Multi-Catch in Kotlin noch nicht unterstützt wird, gibt es weitere Alternativen, die erwähnt werden sollten.
Abgesehen davon try-catch-whenkönnen Sie auch eine Methode implementieren, um einen Multi-Catch nachzuahmen. Hier ist eine Option:
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
}
}
Und es würde so aussehen:
fun main(args: Array<String>) {
{
println("Hello")
}.catch(IOException::class, IllegalAccessException::class) {
}
}
Sie möchten eine Funktion verwenden, um ein Lambda zu erzeugen, anstatt wie oben gezeigt ein rohes Lambda zu verwenden (andernfalls werden Sie ziemlich schnell auf "MANY_LAMBDA_EXPRESSION_ARGUMENTS" und andere Probleme stoßen). So etwas fun attempt(block: () -> Unit) = blockwürde funktionieren.
Natürlich möchten Sie vielleicht Objekte anstelle von Lambdas verketten, um Ihre Logik eleganter zu gestalten oder sich anders zu verhalten als ein einfacher alter Versuch.
Ich würde nur empfehlen, diesen Ansatz gegenüber Miensols zu verwenden , wenn Sie eine Spezialisierung hinzufügen . Für einfache Multi-Catch-Anwendungen ist ein whenAusdruck die einfachste Lösung.
pdvriezeThis 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)