Bird
Raised Fist0
C Sharp (C#)programming~10 mins

Throw and rethrow patterns in C Sharp (C#) - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Throw and rethrow patterns
Start
Try block
Exception occurs?
NoEnd
Yes
Catch block
Throw new exception
Rethrow original exception
Exception propagates
End
The program tries code; if an error happens, it catches it and either throws a new error or rethrows the original one to pass it up.
Execution Sample
C Sharp (C#)
try {
  int x = 0;
  int y = 5 / x;
} catch (Exception e) {
  throw; // rethrow
}
This code tries to divide by zero, catches the error, and rethrows the same error to be handled elsewhere.
Execution Table
StepActionException StateOutput/Result
1Enter try blockNo exceptionNo output
2Execute 'int y = 5 / x;'DivideByZeroException thrownException caught
3Enter catch blockException caught as 'e'No output
4Execute 'throw;'Rethrow original exceptionException propagates up
5No further catch hereException unhandledProgram may terminate or higher handler catches
💡 Exception rethrown and not handled here, so it propagates up the call stack.
Variable Tracker
VariableStartAfter Step 2After Step 3Final
x0000
yundefinedException thrown, no valueundefinedundefined
e (exception)nullnullDivideByZeroException instanceDivideByZeroException instance
Key Moments - 2 Insights
Why does 'throw;' rethrow the original exception instead of creating a new one?
'throw;' without an exception object preserves the original stack trace, as shown in step 4 of the execution_table, so debugging info is not lost.
What happens if you use 'throw e;' instead of 'throw;'?
Using 'throw e;' creates a new exception throw, resetting the stack trace, unlike 'throw;' which rethrows the original exception as in step 4.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, at which step is the exception first caught?
AStep 3
BStep 2
CStep 4
DStep 5
💡 Hint
Check the 'Exception State' column to see when the exception is caught.
According to variable_tracker, what is the value of 'y' after step 2?
A5
Bundefined due to exception
C0
DDivideByZeroException
💡 Hint
Look at the 'y' row and the 'After Step 2' column in variable_tracker.
If we replaced 'throw;' with 'throw e;', what would change in the execution_table?
AException would not propagate
BException would be caught earlier
CStack trace would reset at step 4
DNo change at all
💡 Hint
Consider the difference between rethrowing and throwing a caught exception object.
Concept Snapshot
Throw and rethrow patterns in C#:
- Use 'throw;' inside catch to rethrow original exception preserving stack trace.
- Use 'throw e;' to throw caught exception but resets stack trace.
- Throwing a new exception creates a new error.
- Rethrow passes error up without losing debugging info.
- Helps manage errors while keeping trace details.
Full Transcript
This visual execution shows how C# handles throw and rethrow patterns. The program tries to divide by zero, which causes an exception. The catch block catches this exception. Using 'throw;' rethrows the original exception preserving its stack trace, so debugging is easier. Variables like 'x' and 'e' are tracked through steps. Key moments clarify why 'throw;' is preferred for rethrowing. The quiz tests understanding of when exceptions are caught, variable states, and differences between throw and rethrow. This helps beginners see how exceptions flow and how to manage them properly.

Practice

(1/5)
1. What does the throw statement do in C# exception handling?
easy
A. It logs the error without stopping the program.
B. It ignores the error and continues execution.
C. It stops the program and signals an error.
D. It automatically fixes the error and resumes.

Solution

  1. Step 1: Understand the purpose of throw

    The throw statement is used to signal that an error has occurred and to stop normal program flow.
  2. Step 2: Recognize program behavior on throw

    When throw is executed, the program stops and looks for a matching catch block or terminates if none is found.
  3. Final Answer:

    It stops the program and signals an error. -> Option C
  4. Quick Check:

    throw stops program = C [OK]
Hint: Throw always stops execution and signals an error [OK]
Common Mistakes:
  • Thinking throw continues program normally
  • Confusing throw with logging
  • Assuming throw fixes errors automatically
2. Which of the following is the correct syntax to rethrow an exception in a catch block without changing it?
easy
A. throw catch;
B. throw ex;
C. throw new Exception();
D. throw;

Solution

  1. Step 1: Identify rethrow syntax

    To rethrow the caught exception preserving the original stack trace, use throw; without specifying the exception variable.
  2. Step 2: Understand difference from throw ex;

    throw ex; resets the stack trace, which is not a pure rethrow.
  3. Final Answer:

    throw; -> Option D
  4. Quick Check:

    Rethrow syntax = throw; [OK]
Hint: Use plain 'throw;' to rethrow without losing stack trace [OK]
Common Mistakes:
  • Using 'throw ex;' which resets stack trace
  • Trying to throw a new exception instead
  • Using invalid syntax like 'throw catch;'
3. What will be the output of the following C# code?
try {
  throw new Exception("Error 1");
} catch (Exception ex) {
  Console.WriteLine(ex.Message);
  throw;
}
medium
A. Error 1 printed, then program terminates with the same exception.
B. No output, program silently terminates.
C. Error 1 printed, then program continues normally.
D. Compilation error due to missing catch block.

Solution

  1. Step 1: Analyze the try block

    The try block throws an exception with message "Error 1".
  2. Step 2: Analyze the catch block

    The catch block prints the exception message, then rethrows the same exception using throw;.
  3. Step 3: Understand program flow after rethrow

    Since the exception is rethrown and not caught again, the program terminates with the same exception after printing.
  4. Final Answer:

    Error 1 printed, then program terminates with the same exception. -> Option A
  5. Quick Check:

    Print then rethrow = B [OK]
Hint: Rethrow after print causes termination with printed message [OK]
Common Mistakes:
  • Assuming program continues after rethrow
  • Thinking no output is printed
  • Confusing rethrow with new exception creation
4. Identify the error in this code snippet:
try {
  // some code
} catch (Exception ex) {
  throw ex;
}
medium
A. Try block must have a finally block.
B. Using throw ex; resets the stack trace, losing original error info.
C. Cannot catch Exception type directly.
D. Missing semicolon after throw ex.

Solution

  1. Step 1: Understand throw ex; effect

    Using throw ex; throws the exception but resets the stack trace, losing original error location.
  2. Step 2: Identify correct rethrow method

    To preserve stack trace, use throw; without specifying the exception variable.
  3. Final Answer:

    Using throw ex; resets the stack trace, losing original error info. -> Option B
  4. Quick Check:

    Throwing exception variable resets stack trace = D [OK]
Hint: Use 'throw;' not 'throw ex;' to keep original stack trace [OK]
Common Mistakes:
  • Thinking 'throw ex;' preserves stack trace
  • Believing finally block is mandatory
  • Assuming Exception cannot be caught directly
5. You want to catch an exception, add extra info, and then rethrow it preserving the original stack trace. Which pattern is correct?
try {
  // code
} catch (Exception ex) {
  // add info
  ???
}
hard
A. throw new Exception("Extra info", ex);
B. throw ex;
C. throw;
D. throw new Exception(ex.Message);

Solution

  1. Step 1: Understand wrapping exceptions

    To add extra info, create a new exception with the original as inner exception: new Exception("Extra info", ex).
  2. Step 2: Preserve original stack trace

    This wrapping keeps original exception details inside the new one, preserving context.
  3. Step 3: Why not other options?

    throw ex; resets stack trace, throw; rethrows original without extra info, and throw new Exception(ex.Message); loses original exception object.
  4. Final Answer:

    throw new Exception("Extra info", ex); -> Option A
  5. Quick Check:

    Wrap with new Exception and inner ex = A [OK]
Hint: Wrap original in new Exception to add info and preserve trace [OK]
Common Mistakes:
  • Using 'throw ex;' which loses stack trace
  • Using 'throw;' which loses added info
  • Creating new Exception without inner exception