Para agregar a la respuesta de miensol : aunque la captura múltiple en Kotlin aún no es compatible, hay más alternativas que deben mencionarse.
Aparte de try-catch-when
, también puede implementar un método para imitar una captura múltiple. Aquí tienes una opción:
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
}
}
Y usarlo se vería así:
fun main(args: Array<String>) {
{
println("Hello")
}.catch(IOException::class, IllegalAccessException::class) {
}
}
Querrá usar una función para producir una lambda en lugar de usar una lambda sin procesar como se muestra arriba (de lo contrario, se encontrará con "MANY_LAMBDA_EXPRESSION_ARGUMENTS" y otros problemas con bastante rapidez). Algo como fun attempt(block: () -> Unit) = block
funcionaría.
Por supuesto, es posible que desee encadenar objetos en lugar de lambdas para componer su lógica de manera más elegante o para comportarse de manera diferente a un simple try-catch.
Solo recomendaría usar este enfoque en lugar de miensol si está agregando alguna especialización . Para usos simples de captura múltiple, una when
expresión es la solución más simple.
pdvrieze
respuesta aquí: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)