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?
3 Réponses :
Selon la documentation de Coroutinescope Code>
: P>
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. P> blockQuote>
Supprimer le
coroutinescope code> et il doit fonctionner comme vous vous attendez à ce que ce soit. p>
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 code> est un enfant du
coroutinescope code> 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 code> au bloc code> async code> et avalant l'exception là-bas à la place.
Je n'ai pas réalisé ce que le échoue cod> 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é.
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
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. P>
Exception ("Exception de test avec attendre () dans async")