Size: a a a

Kotlin Community

2020 December 17

VP

Vladimir Petrakovich in Kotlin Community
Оно не дружит с корутинами ровно никак
источник

I

Igor in Kotlin Community
Vladimir Petrakovich
Так, а @Synchronized зачем?
не нужен абсолютно, осталось от заготовки в плейграунде
источник

I

Igor in Kotlin Community
Vladimir Petrakovich
Не верю 🙂
да, совешенно верно, вызывается асинхронно, но handler не ловит эксепшн
источник

VP

Vladimir Petrakovich in Kotlin Community
Igor
да, совешенно верно, вызывается асинхронно, но handler не ловит эксепшн
Может, потому что программа завершается до его возникновения?
источник

I

Igor in Kotlin Community
Vladimir Petrakovich
Может, потому что программа завершается до его возникновения?
не
источник

I

Igor in Kotlin Community
источник

I

Igor in Kotlin Community
Сихронно launch отрабатывает если контекст брать из coroutineContext
val scope = CoroutineScope(coroutineContext)
scope.launch{} - и вот этот код срабатывает синхронно внутри suspend функции
источник

I

Igor in Kotlin Community
просто sendbox не умеет coroutineContext
источник

I

Igor in Kotlin Community
так, стоп, в песочнице все работает… сорян, пойду попью чай
источник

VP

Vladimir Petrakovich in Kotlin Community
Igor
Сихронно launch отрабатывает если контекст брать из coroutineContext
val scope = CoroutineScope(coroutineContext)
scope.launch{} - и вот этот код срабатывает синхронно внутри suspend функции
А, так вы handler указали не у scope, а у конкретного launch, вот оно на второй и не влияет
источник

VP

Vladimir Petrakovich in Kotlin Community
Вы хотите чтобы он всё равно тот же использовался?
источник

I

Igor in Kotlin Community
val handler = CoroutineExceptionHandler { _, exception ->
           println("CoroutineExceptionHandler got $exception")
           }
val scope = CoroutineScope(SupervisorJob())

suspend fun criticalSectionSuspending() {
 println("Starting!")
    val scope2 = CoroutineScope(coroutineContext)
    val someJob = scope2.launch {
         delay(200)
                    println("Delay!")
                   throw Exception("Delay Exception")                
           }
    println("Ending!")
}
fun main() {
 scope.launch(handler) {criticalSectionSuspending()}
 Thread.sleep(500)
}
источник

I

Igor in Kotlin Community
вот так работает все, и handler тоже
источник

VP

Vladimir Petrakovich in Kotlin Community
Igor
val handler = CoroutineExceptionHandler { _, exception ->
           println("CoroutineExceptionHandler got $exception")
           }
val scope = CoroutineScope(SupervisorJob())

suspend fun criticalSectionSuspending() {
 println("Starting!")
    val scope2 = CoroutineScope(coroutineContext)
    val someJob = scope2.launch {
         delay(200)
                    println("Delay!")
                   throw Exception("Delay Exception")                
           }
    println("Ending!")
}
fun main() {
 scope.launch(handler) {criticalSectionSuspending()}
 Thread.sleep(500)
}
Да, так будет работать, но такой код ломает structured concurrency (если вас это вообще волнует)
источник

I

Igor in Kotlin Community
Почему ломает?
источник

VP

Vladimir Petrakovich in Kotlin Community
Igor
Почему ломает?
Как минимум потому что
1. После завершения работы suspend функции что-то запущенное из неё продолжает работать
2. Это что-то может кидать исключения мимо try { }
В общем, очень плохой подход, не надо так. Поддерживаемость такого кода будет на дне.
источник

I

Igor in Kotlin Community
1. согласен, тут надо ручками менеджить
2. как? я ж как раз и заморачиваюсь, чтобы все что произошло внутри этой суспенд функции с ошибкой, прилетело в самый самый верхний эксепшнХендлер
источник

VP

Vladimir Petrakovich in Kotlin Community
В вашем случае можно сделать так:
suspend fun criticalSectionSuspending() = coroutineScope {
   println("Starting!")
   val someJob = launch {
       delay(200)
       println("Delay!")
       throw Exception("Delay Exception")                
   }
   println("Ending!")
}
источник

VP

Vladimir Petrakovich in Kotlin Community
Igor
1. согласен, тут надо ручками менеджить
2. как? я ж как раз и заморачиваюсь, чтобы все что произошло внутри этой суспенд функции с ошибкой, прилетело в самый самый верхний эксепшнХендлер
А с чего оно должно прилетать в верхний ExceptionHandler, если например вызов этой функции обёрнут в try { }?
Вы бы объяснили свою задачу подробнее, пока вообще не понятно, зачем писать такой код.
источник

I

Igor in Kotlin Community
так нет оберток в try
источник