
Eric Niebler wrote:
Rob Stewart wrote:
That way a debug build asserts, which likely gets a core dump, and a release build throws an exception. If the exception is a type that is never caught in the code except in main(), then main() can report the problem and exit. That gives a clean exit with a diagnostic in release builds, while giving the opportunity for post mortem debugging in debug builds.
No. An assert should not throw, not in release mode, not ever. If an assert fails, your program is now in an invalid state. Throwing an exception potentially causes lots of code to execute that is potentially dangerous. The correct thing to do is dump core immediately. Maybe try to save user data into into a separate location, taking care not to overwrite the last-known-good with potentially corrupt data, but that's it. Assert != exception.
Fine. But why not use an exception as part of the mechanism for saving some (hopefully) recoverable data?