0
votes

pourquoi avoir essayé / attraper en corutineascope block bloque toujours à l'exception de l'exception capturée

  fun main() = runBlocking {
        coroutineScope {

            val child = async {
                Log.e("+++", "+++  in  async{}, throw exception , ${Thread.currentThread().name}")
                throw Exception("test exception with await() in async")
            }

            try {
                child.await()
            } catch(ex: Throwable) {
                Log.e("+++", "+++  child.await() caught  exception $ex, ${Thread.currentThread().name}")
            }

        }
  }
The log "+++  child.await() caught  exception java.lang.Exception: test exception with await() in aync, main" . shows the exception is caught,  but it still crashes the app.Why the expiation caught is still crashing the app with coroutines?

1 commentaires

Exception ("Exception de test avec attendre () dans async")


3 Réponses :


1
votes

Selon la documentation de Coroutinescope :

Cette fonction est conçue pour la décomposition parallèle du travail. Lorsque tout enfant Coroutin dans cette lunette échoue, cette étendue échoue et tout le reste des enfants sont annulés (pour un comportement différent, voir Supervisorscope). Cette fonction revient dès que le bloc donné et toutes ses enfants Coroutines sont terminées.

Supprimer le coroutinescope et il doit fonctionner comme vous vous attendez à ce que ce soit.


3 commentaires

merci @kiskae! Je suppose que cela ne dit pas pourquoi l'essai / attrape n'empêche pas l'accident avec le coroutinécope.


Parce que async est un enfant du coroutinescope et il a échoué. Quels que soient l'autre code dans la portée, le gestionnaire d'exception entraînera l'échec de la portée extérieure selon la documentation. Vous pouvez le contourner en attribuant un Exceptionnel (code> Exceptionnel au bloc async et avalant l'exception là-bas à la place.


Je n'ai pas réalisé ce que le échoue signifie dans le "quel que soit l'autre quel que soit l'autre code dans la portée, le gestionnaire d'exception entraînera l'échec de la portée extérieure". Il est différent avec les coroutines qui, dans certains cas, l'essai / capture n'empêche pas l'accident tel qu'il est habitué.



1
votes

trouver cela est utile aussi bien , et ici :

whenever a coroutine created by async() throws an exception, 
the same exception is thrown both by its Deferred.await() 
and inside the body of the parent coroutine as well! 
This means that, no matter if we catch the exception by surrounding await() with try/catch, 
our app is still going to crash because the exception is not thrown just 
from the await() suspension point


0 commentaires

0
votes

Exception projetée par les bulles de l'enfant Coroutin jusqu'à son parent immédiat. Vous devez essayer de capturer des exceptions dans les coroutines parent. Cette application ne se bloque pas.


0 commentaires