In my codebase I have some retry functionality that stores an exception in a variable and at the end throws the exception in the variable. Imagine something like this
Exception exc = null;
while(condition){
try {
// stuff
} catch (Exception e){
exc = e;
}
}
if (e != null){
throw e;
}
Now, since this is a throw e statement and not a throw statement, the original stack trace is lost. Is there some way to do a rethrow that preserves the original stack trace, or will I need to restructure my code so I can use a throw statement?
That's where ExceptionDispatchInfo comes into play.
It resides inside the System.Runtime.ExceptionServices namespace.
class Program
{
static void Main(string[] args)
{
ExceptionDispatchInfo edi = null;
try
{
// stuff
throw new Exception("A");
}
catch (Exception ex)
{
edi = ExceptionDispatchInfo.Capture(ex);
}
edi?.Throw();
}
}
The output:
Unhandled exception. System.Exception: A
at EDI_Demo.Program.Main(String[] args) in C:\Users\...\Program.cs:line 16
--- End of stack trace from previous location where exception was thrown ---
at EDI_Demo.Program.Main(String[] args) in C:\Users\...\Program.cs:line 24
throw new Exception("A"); is callededi?.Throw(); is calledIf you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With