163 votes

Comment intercepter plusieurs exceptions en même temps à Kotlin

 try { 

} catch (ex: MyException1, MyException2 ) {
    logger.warn("", ex)
}
 

ou

 try { 

} catch (ex: MyException1 | MyException2 ) {
    logger.warn("", ex)
}
 

En conséquence, une erreur de compilation: Unresolved reference: MyException2 .

Comment puis-je intercepter plusieurs exceptions en même temps sur Kotlin?

195voto

miensol Points 1889

Selon ce fil, cette fonctionnalité n'est pas prise en charge pour le moment.

abreslav - Equipe JetBrains

Pas pour le moment, mais c'est sur la table

Vous pouvez cependant imiter la capture multiple:

 try {
    // do some work
} catch (ex: Exception) {
    when(ex) {
        is IllegalAccessException, is IndexOutOfBoundsException -> {
            // handle those above
        }
        else -> throw ex
    }
}
 

14voto

Aro Points 350

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X