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
Eif the constant-expression in its noexcept-specification evaluates tofalseor its dynamic-exception-specification contains a typeTfor which a handler of typeTwould 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
} |
...