через list.map { async { it.run() } } .awaitAll() Внутри каждого метода run есть try/catch, который пишет в лог результат работы корутины, проблема в том, что когда одна корутина падает с ошибкой, то во все остальные прокидывается cancellationException и соответственно в catch мы отлавливаем ошибку из другой корутины и пишем не верные данные в лог. Можно ли как-то сделать, что бы, если одна корутина прокинула ошибку, все остальные останавливали работу, но cancellationException не получали?
try { // ... } catch (e: Exception) { when (e) { is CancellationException -> // stop gracefully else -> // log error } }
Пробовал такое, но уже не помню почему отказался от этого, возможно оригинальный эксепшен, который нужно логировать, тоже оборачивается в CancellationException
Если нету возможности переписать тот хендлинг, можно свой exception ловить class MyCancellationException() : CancellationException() launch { try { // ... } catch (e: Exception) { when (e) { is MyCancellationException -> // Graceful stop is CancellationException -> // Log else -> // Log } } }
Обсуждают сегодня