Как напечатать текущую трассировку стека внутри функции приостановки? - PullRequest
1 голос
/ 23 октября 2019

Как я могу напечатать текущую трассировку стека внутри функции приостановки?

Если я попробую обычным способом:

    suspend fun f() {
        Exception().printStackTrace()
    }

Будет напечатано что-то вроде:

java.lang.Exception
    at car2share.sync.reservations.ReservationLogWriter.write(ReservationLogWriter.kt:105)
    at car2share.sync.reservations.ReservationLogWriter$write$2.invokeSuspend(ReservationLogWriter.kt)
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241)
    at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:270)
    at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:79)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:54)
    at kotlinx.coroutines.BuildersKt.runBlocking(Unknown Source)
    at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking$default(Builders.kt:36)
    at kotlinx.coroutines.BuildersKt.runBlocking$default(Unknown Source)

Который не содержит полную трассировку стека.

1 Ответ

0 голосов
/ 23 октября 2019

Вы можете попробовать вызвать исключение в функции приостановки:

suspend fun f() {
   kotlin.runCatching {
     //any code that can throw an exception
     throw Exception()
     }.onFailure {
     //print stack trace
     it.printStackTrace()
  }
}
...