MrZarq
MrZarq

Reputation: 258

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

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?

Upvotes: 3

Views: 1603

Answers (1)

Peter Csala
Peter Csala

Reputation: 22679

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

Upvotes: 8

Related Questions