try {
} catch (ex: MyException1, MyException2 ) {
logger.warn("", ex)
}
oder
try {
} catch (ex: MyException1 | MyException2 ) {
logger.warn("", ex)
}
Infolgedessen ein Kompilierungsfehler : Unresolved reference: MyException2
.
Wie kann ich auf Kotlin viele Ausnahmen gleichzeitig abfangen?
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
Klausel löst die unerwünschte Ausnahme erneut aus.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-when
kö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") // some code that could throw an exception }.catch(IOException::class, IllegalAccessException::class) { // Handle the exception } }
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) = block
wü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
when
Ausdruck die einfachste Lösung.quelle
exceptions
nimmt Objekte.Das Beispiel von aro ist sehr gut, aber wenn es Vererbungen gibt, funktioniert es nicht wie in Java.
Ihre Antwort hat mich dazu inspiriert, eine Erweiterungsfunktion dafür zu schreiben. Um auch geerbte Klassen zuzulassen, müssen Sie suchen,
instance
anstatt direkt zu vergleichen.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 }}
Um zu sehen , wie zu benutzen, können Sie einen Blick in meiner Bibliothek auf GitHub haben hier
quelle