According to the The C++ Standard, [except.spec], paragraph 8 [ISO/IEC 14882-2014], states the following:
A function is said to allow an exception of type
E
if the constant-expression in its noexcept-specification evaluates tofalse
or its dynamic-exception-specification contains a typeT
for which a handler of typeT
would be a match (15.3) for an exception of typeE
.
...
In this noncompliant code example, the second function claims to throw only Exception1
, but it may also throw
:Exception2
.
Code Block | ||||
---|---|---|---|---|
| ||||
#include <exception> class Exception1 : public std::exception {}; class Exception2 : public std::exception {}; void foo() { throw Exception2{}; // Okay because foo() promises nothing about exceptions } void bar() throw (Exception1) { foo(); // Bad because foo() can throw Exception2 } |
...
This compliant solution catches the exceptions thrown by foo()
:.
Code Block | ||||
---|---|---|---|---|
| ||||
#include <exception> class Exception1 : public std::exception {}; class Exception2 : public std::exception {}; void foo() { throw Exception2{}; // Okay because foo() promises nothing about exceptions } void bar() throw (Exception1) { try { foo(); } catch (Exception2 e) { // Handle error without rethrowing it } } |
...
This compliant solution declares a dynamic exception-specification for bar()
, which covers all of the exceptions that can be thrown from it:.
Code Block | ||||
---|---|---|---|---|
| ||||
#include <exception> class Exception1 : public std::exception {}; class Exception2 : public std::exception {}; void foo() { throw Exception2{}; // Okay because foo() promises nothing about exceptions } void bar() throw (Exception1, Exception2) { foo(); } |
...
In this noncompliant code example, a function is declared as nonthrowing, but it is possible for std::vector::resize()
to throw an exception when the requested memory cannot be allocated:.
Code Block | ||||
---|---|---|---|---|
| ||||
#include <cstddef> #include <vector> void f(std::vector<int> &v, size_t s) noexcept(true) { v.resize(s); // May throw } |
...
In this compliant solution, the function's noexcept-specification is removed, signifying that the function allows all exceptions:.
Code Block | ||||
---|---|---|---|---|
| ||||
#include <cstddef> #include <vector> void f(std::vector<int> &v, size_t s) { v.resize(s); // May throw, but that is okay } |
...