Size: a a a

2019 October 22

RI

Ruslan Ibragimov in Kotlin Moscow
Что как бы дорого, и не нужно для большинства
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Где-то есть issue одобренное в kotlinx.coroutines или youtrack?
источник

VS

Vladimir Sitnikov in Kotlin Moscow
тут вообще нет try-catch
источник

VS

Vladimir Sitnikov in Kotlin Moscow
я говорю о про стой доработке:
ResultKt.throwOnFailure((Object)$result); => ResultKt.throwOnFailure((Object)$result, "CoroutineTest.kt:23");
источник

RI

Ruslan Ibragimov in Kotlin Moscow
я не про try, а про throw
источник

RI

Ruslan Ibragimov in Kotlin Moscow
ты дергаешь корутину с cancellation exception, и он бросается
источник

RI

Ruslan Ibragimov in Kotlin Moscow
а это штатная ситуация на самом деле
источник

RI

Ruslan Ibragimov in Kotlin Moscow
А с try-catch тоже не все просто, и еще усложняет все

https://gist.github.com/IRus/9226442c157748d43e26c636c0fe0f4b
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Самое обидное, что ты не можешь использовать CancellationException в стдлиб. И если даже поменять поведение теперь, то старый скомпиленный код будет по другому работать
источник

RI

Ruslan Ibragimov in Kotlin Moscow
> Где-то есть issue одобренное в kotlinx.coroutines или youtrack?
источник

I

Ilmir in Kotlin Moscow
Vladimir Sitnikov
Оказалось, современные корутины не показывают стектрейс при CancellationException.
Иными словами, невозможно понять «чем хоть примерно» занималась корутина когда её отменяли.

https://stackoverflow.com/questions/58482407/is-there-a-way-to-understand-what-the-coroutine-was-doing-when-it-was-cancelled
источник

I

Ilmir in Kotlin Moscow
Sergey Morgunov
Это понятно. Но если теоретическая возможность посмотреть на стек корутины всё таки есть, может можно затащить это в какую-нибудь проперти, чтобы при необходимости у пользователя была всё-таки возможность посмотреть 😀
Она есть. Берете continuation, вызываете на нем toString. Берете у него completion, вызываете все так же toString. Повторять до KNPE.
источник

I

Ilmir in Kotlin Moscow
Vladimir Sitnikov
Хочу заметить, что я прошу про .cancel()
А эта операция у корутины бывает лишь однажды.
Я понимаю, что тяжело «задним числом» узнать все её supsension точки.

Но можно же в момент «когда мы ей сказали остановиться» заставить эту корутину создать хотя бы один стек. Хотя бы того места, где она проснулась и обнаружила cancellation.

Стоит помнить, что мудрейшие завещали, что «cancellation is cooperative», и корутина реально должна проснуться, чтобы заметить факт своей отмены. И тут в самый раз был бы сбор стектрейса.

Я слоняюсь к тому, что это просто баг.
Если использовать дебаг-мод в корутинах, то стектрейс будет на месте.
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Ilmir
Если использовать дебаг-мод в корутинах, то стектрейс будет на месте.
Завёл тикет: https://github.com/Kotlin/kotlinx.coroutines/issues/1625
Почему бы не добавить дополнительный string параметр в ResultKt.throwOnFailure ?
источник

I

Ilmir in Kotlin Moscow
Async stacktrace у нас строится библиотекой. Она пробегает по всем continuation'онам и строит его. Компилятору/сгенерированной стейт-машине без разницы, какой Throwable подали в resumeWith, он будет проброшен по цепочке в родительский continuation (который мы называем completion). CancellationException не исключение. Но, из-за того, что он используется не только в исключительных ситуациях, а является частью механизма работы struсtured concurrency, то есть кидается часто (относительно других исключений), то для перформанса библиотека не строит для него async stacktrace в релизе. Только в дебаге.
источник

RI

Ruslan Ibragimov in Kotlin Moscow
Нельзя же так сделать, т.к. неучтен кейс с try/catch
источник

I

Ilmir in Kotlin Moscow
Потому что он не нужен. У нас уже есть аннотация DebugMetadata, которая содержит всю информацию, нужную для построения StackTraceElement.
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Ilmir
Потому что он не нужен. У нас уже есть аннотация DebugMetadata, которая содержит всю информацию, нужную для построения StackTraceElement.
Это здорово. Но так ли проблемно в cancellation случае генерировать стек?
источник

VS

Vladimir Sitnikov in Kotlin Moscow
Сейчас получается, что когда что-нибудь пошло не так, то невозможно понять что именно
источник

I

Ilmir in Kotlin Moscow
Vladimir Sitnikov
Это здорово. Но так ли проблемно в cancellation случае генерировать стек?
Минутку, у меня идея решила перестроить индексы.
источник