Async-friendly format for stack traces and exceptions
Note I have released version 1.7.0
of this package for .NET 6+ that basically calls StackTrace.ToString()
and Exception.ToString()
and adds Obsolete
attributes, to alert users it is no longer needed.
Async-friendly format for stack traces and exceptions.
Also check out Ben's Demystifier which resolves async, iterators, tuples, location functions and more.
System.Exception: Crash! Boom! Bang!
at async AsyncFriendlyStackTrace.Test.Example1.C(?) in C:\Source\Repos\AsyncFriendlyStackTrace\src\AsyncFriendlyStackTrace.Test\Example1.cs:line 26
at async AsyncFriendlyStackTrace.Test.Example1.B(?) in C:\Source\Repos\AsyncFriendlyStackTrace\src\AsyncFriendlyStackTrace.Test\Example1.cs:line 20
at async AsyncFriendlyStackTrace.Test.Example1.A(?) in C:\Source\Repos\AsyncFriendlyStackTrace\src\AsyncFriendlyStackTrace.Test\Example1.cs:line 15
at async AsyncFriendlyStackTrace.Test.Example1.Run(?) in C:\Source\Repos\AsyncFriendlyStackTrace\src\AsyncFriendlyStackTrace.Test\Example1.cs:line 10
at AsyncFriendlyStackTrace.Test.Program.Run[TExample](TextWriter writer) in C:\Source\Repos\AsyncFriendlyStackTrace\src\AsyncFriendlyStackTrace.Test\Program.cs:line 45
Install-Package AsyncFriendlyStackTrace
To format exceptions, use the extension methods in ExceptionExtensions
:
exception.ToAsyncString();
This produces an async-friendly format, as you can see in the examples below. There is also special handling for AggregateException
s and ReflectionTypeLoadException
(which can contain multiple inner exceptions).
The main formatting work is done by the StackTraceExtensions.ToAsyncString
extension method. The async-friendly formatting is archieved by:
INotifyCompletion
) and ExceptionDispatchInfo
frames.IAsyncStateMachine
)
and removing the "MoveNext" - currently only for C#.In all the examples, OLD refrers to ToString()
output, while NEW is ToAsyncString()
.
Wait()
in the middle, causing an AggregateException
.AggregateException
formatting (the first inner exception isn't repeated twice).PrepareForAsyncSerialization
before serializing the exception. This saves the async-friendly stack trace as a string in the Data
dictionary of the exception. This has two downsides:
DataContractSerializer
, you must include exception.Data.GetType()
as a known type. This is because its concrete type (ListDictionaryInternal
) is internal.