Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C#: Rethrow an exception from a variable while preserving stack trace

Tags:

c#

.net

exception

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?

like image 497
MrZarq Avatar asked Sep 23 '26 19:09

MrZarq


1 Answers

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
  • Line 16 is where throw new Exception("A"); is called
  • Line 24 is where edi?.Throw(); is called
like image 159
Peter Csala Avatar answered Sep 25 '26 09:09

Peter Csala



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!