3

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?

4
  • InnerException? Commented Nov 19, 2020 at 14:19
  • But then I lose my Type info, so exception handlers that look at the type will not see the original type. Commented Nov 19, 2020 at 14:20
  • Wouldn't the original exception e contain the stack trace in its StackTrace property? Commented Nov 19, 2020 at 14:21
  • 1
    The accepted answer here might help. Commented Nov 19, 2020 at 14:24

1 Answer 1

8

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
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.