There can be levels of exception safety requirements from a class/component/method:
* The basic exception guarantee: The invariants of the component are preserved, and no resources are leaked in the face of an exception.
* The strong exception guarantee: The operation has either completed successfully or thrown an exception, leaving the program state exactly as it was before the operation started. (commit-or-rollback semantics.)
* The no-throw exception guarantee: The operation will not throw an exception.
* The exception-neutrality: In a generic component, we usually have an additional expectation of exception-neutrality, which means that exceptions thrown by a component's type parameters (template parameter) should be propagated, unchanged, to the component's caller.