Size: a a a

2019 October 22

RI

Ruslan Ibragimov in Kotlin Moscow
Vladimir Sitnikov
английским по белому написано, что выбрасывается CancellationException
И как это противоречит тому что я пишу?
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Ruslan Ibragimov
И как это противоречит тому что я пишу?
Ну, по вашим словам складывается ощущение, что реальный стек не сохраняется (debug режимы предлагаю не рассматривать, обсуждаем production режим).
Реальный стек (хотя бы один метод) сохраняется или нет?
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Предположим что он сохраняется. Кто и зачем будет его сохранять?
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Если сохраняется, то нет проблем добавить его при возникновении CancellationException из вызова delay(..)
источник

Ⓢⓔⓡⓖ in Kotlin Moscow
Коллеги!
Алгоритм - это последовательность предписаний исполнителю выполнить некоторые действия.
Дайте плз определение Исполнителя в случае корутин и не-корутин.
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Для работы корутин стек не нужен. Сохранять стек - дорого. При дебаге - пожалуйста. В проде - нет конечно
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Ruslan Ibragimov
Для работы корутин стек не нужен. Сохранять стек - дорого. При дебаге - пожалуйста. В проде - нет конечно
Казалось бы.

Но есть контрпример.

Берём пример (второй, который с throw RuntimeException) со страницы https://stackoverflow.com/questions/58482407/is-there-a-way-to-understand-what-the-coroutine-was-doing-when-it-was-cancelled

Вбиваем его в https://play.kotlinlang.org и видим, что в результирующем стектрейсе есть File.kt:9, которое однозначно показывает на местоположение строки throw RuntimeException.

Значит, стектрейс никуда не пропадает, что и требовалось доказать
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Ruslan Ibragimov
О, кстати там чуть выше и показано как без recovery стек выглядит, что я и пытаюсь донести
Прошу обратить внимание на то, что пример «без recovery» содержит бизнес фреймы.
Иными, словами, даже «без recovery» в стектрейсе видно example.PublicApiImplementation.doWork(Example.kt:19)

Это как бы тоже противоречит тому, что «В корутинах фреймы не сохраняются»  и «Там стектрейс будет»
источник

RI

Ruslan Ibragimov in Kotlin Moscow
import kotlinx.coroutines.*

suspend fun test() {
   println("test.begin")
   try {
       delay(5000)
   } catch (e: TimeoutCancellationException) {
       // It is important to throw an exception different from CancellationException
       throw RuntimeException("delay was cancelled", e) // <-- line 9
   }
   println("test.end")
}

suspend fun proxy() {
   test()
}

fun main() {
   runBlocking { // <-- line 15
       withTimeout(100) {
           proxy()
       }
   }
}


есть ли вызов proxy в "стеке"?  😉
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Есть:

import kotlinx.coroutines.*

suspend fun test() {
   println("test.begin")
   try {
       delay(5000)
   } catch (e: Throwable) {
       // It is important to throw an exception different from CancellationException
       throw RuntimeException("in test", e)
   }
   println("test.end")
}

suspend fun proxy() {
   try {
       test()
   } catch (e: Throwable) {
       // It is important to throw an exception different from CancellationException
       throw RuntimeException("in proxy", e)
   }
}

fun main() {
   runBlocking {
       withTimeout(100) {
           proxy()
       }
   }
}
источник

RI

Ruslan Ibragimov in Kotlin Moscow
А куда вызов тест пропал? 🙂
источник

VS

Vladimir Sitnikov in Kotlin Moscow
его скушал kotlin
источник

VS

Vladimir Sitnikov in Kotlin Moscow
это бага
источник

VS

Vladimir Sitnikov in Kotlin Moscow
тут есть оба: in test и in proxy
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Нету
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Может у меня неправильный Kotlin
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Да есть там всё.

Вот пример:

import kotlinx.coroutines.*

suspend fun test() {
   println("test.begin")
   try {
       delay(5000)
   } catch (e: Throwable) {
       throw RuntimeException("in test").also { it.printStackTrace() }
   }
   println("test.end")
}

suspend fun proxy() {
   try {
       test()
   } catch (e: Throwable) {
       throw RuntimeException("in proxy").also { it.printStackTrace() }
   }
}

fun main() {
   runBlocking {
       withTimeout(100) {
           proxy()
       }
   }
}
источник

VS

Vladimir Sitnikov in Kotlin Moscow
test.begin
java.lang.RuntimeException: in test
at FileKt.test(File.kt:8)

java.lang.RuntimeException: in proxy
at FileKt.proxy(File.kt:17)
источник

RI

Ruslan Ibragimov in Kotlin Moscow
ну конечно в таком виде он есть
источник

RI

Ruslan Ibragimov in Kotlin Moscow
только из-за того что я уже устал объяснять: корутинам он не нужен, они его не сохраняют его не будет во втором стектрейсе
источник