Tracing is about tracing the structure of an IO
computation. Basically, giving some insight into the graph formed by the IO
. Tracing is accumulated as the graph is constructed (e.g. by instantiating an IO.Bind
node) and reified at the following points:
- Whenever requested by
backtrace: IO[Trace]
orprintBacktrace: IO[Unit]
- Whenever an error case is instantiated (
IO.Error
)
Whenever an exception is rethrown by the interpreter (most commonly in unsafeRunSync()
), the associated trace information for that exception should be put into a TracedException
wrapper (with cause =
the original exception) and that exception should be thrown. This allows backtrace information to participate in side-effectful error recovery and reporting mechanisms. We should consider whether or not we want to also do this with unsafeRunAsync
. I'm leaning toward "yes". We should not wrap in TracedException
on attempt
, raiseError
, or any of the other pure error reification mechanisms.