How to print current stack trace inside a suspending function?

Viewed 1194

How can I print current stack trace inside a suspending function?

If I try the usual way:

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

It will print something like:

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)

Which does not contain the full stack trace.

2 Answers

You can try throwing an exception in suspending function :

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