Pour ajouter à miensol's réponse: bien que la multi-prise en Kotlin n'est pas encore pris en charge, il y a plus de solutions de rechange qui doivent être mentionnées.
En dehors de la try-catch-when
, vous pourriez également mettre en œuvre une méthode pour simuler une multi-prise. Voici une 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
}
}
Et l'aide qu'il pourrait ressembler:
fun main(args: Array<String>) {
// ...
{
println("Hello") // some code that could throw an exception
}.catch(IOException::class, IllegalAccessException::class) {
// Handle the exception
}
}
Vous aurez envie d'utiliser une fonction pour produire un lambda plutôt que d'utiliser un raw lambda comme indiqué ci-dessus (sinon, vous allez exécuter en "MANY_LAMBDA_EXPRESSION_ARGUMENTS" et d'autres questions assez rapidement). Quelque chose comme fun attempt(block: () -> Unit) = block
serait de travailler.
Bien sûr, vous ne voulez chaîne d'objets au lieu de les lambdas pour la composition de votre logique plus élégamment ou à se comporter différemment que d'un simple vieux try-catch.
Je ne le recommande l'utilisation de cette approche sur miensol's si vous ajoutez une certaine spécialisation. Pour la simple multi-catch des usages, when
expression est la solution la plus simple.