Kotlin – Продолжить Coroutine после исключения

Мой вопрос

Можно ли продолжить выполнение сопрограммы после исключения?

пример

try { someMethod1() someMethod2() //Throws an exception! someMethod3() } catch(e: Exception) { //I do not want to call someMethod3 here! //I want the coroutine to resume after the exception inside of the original block. } finally { //I also do not want to call someMethod3 here! //I want the coroutine to resume after the exception inside of the original block. } 

Я не уверен, что это возможно, но заблаговременно за то, что посмотрели!

Короткий ответ заключается в том, что это невозможно. Более длинный ответ таков:

Kotlin coroutines позволяют приостановить выполнение кода только в запланированных точках подвески (используя приостанавливающие функции). Корутинги не являются общей конструкцией управления, подобной хото. Напротив, это очень хорошо ограниченная и тщательно проверенная концепция потока управления, которая гарантирует, что вы не нарушите иллюзию последовательного выполнения кода, несмотря на то, что вы можете приостановить выполнение кода и возобновить его позже.

Kotlin coroutines реализует однократные продолжения, и как только блок кода приостановлен, его можно возобновить только один раз, чтобы продолжить его регулярную последовательную логику выполнения, например, если код выдал исключение, вы все равно можете приостановить идентификатор, но вы можете возобновить его только до продолжайте делать то, что он собирается (обрабатывая это исключение).

Для этого someMethod1 , someMethod2 и someMethod3 должны быть suspend fun . Тогда вам нужно только поймать исключение в контроллере и возобновить сопрограмму.