Sometimes you catch an exception, do some cleanup, then want to let it propagate. Use throw; with no argument to rethrow. Example: catch (const exception& e) { logError(e); throw; } This logs the error, then passes it up unchanged.
The original exception type is preserved. Don't use throw e; (with the exception variable). This slices the exception: if e is a derived type, you'd throw a copy of just the base part.
Rethrowing is useful for resource cleanup, logging, or partial handling. The outer code still sees the original exception and can handle or rethrow again.