1. Problem It Solves
Exception safety defines what state remains when an operation fails, while noexcept records that a function promises not to let exceptions escape. It makes an important constraint visible instead of leaving readers to guess. This lesson keeps only the C++11 core that fits one focused day.
2. Prerequisites
The ideas from Day 25, plus basic variables, functions, and output already introduced.
3. Core Idea
Mental model: Exception safety defines what state remains when an operation fails, while noexcept records that a function promises not to let exceptions escape. Identify the relevant value or state, who owns it, and whether the rule acts during compilation or execution.
4. Minimal Syntax
void cleanup() noexcept; try { risky(); } catch (const std::exception& e) { }5. How It Works
The example creates a tiny fixed state with no keyboard input.
C++11 or the standard-library contract applies today's rule.
The program prints the important result so it can be checked against the source.
6. Common Mistakes
Letting an exception escape a
noexceptfunction callsstd::terminate, so the specifier must describe a real guarantee.
7. When to Use It
Use it when designing failure paths and non-throwing cleanup or move operations.
Avoid it when it hides ownership, lifetime, type, ordering, or cost.
8. Simple Example
A checked division throws for zero, the caller catches the error, and a tiny cleanup function demonstrates a true non-throwing operation. The .cpp keeps the data fixed and avoids unrelated abstraction.
Complete sample code
Source file
cpp11/26_exception_safety_noexcept/main.cpp
#include <iostream>
#include <stdexcept>
double divide(double numerator, double denominator) {
if (denominator == 0.0) {
throw std::invalid_argument("zero denominator");
}
return numerator / denominator;
}
void cleanup() noexcept {
std::cout << "cleanup\n";
}
int main() {
try {
std::cout << divide(8.0, 2.0) << '\n';
std::cout << divide(1.0, 0.0) << '\n';
} catch (const std::exception& error) {
std::cout << "caught=" << error.what() << '\n';
}
cleanup();
}
9. Key Takeaways
The feature is part of the C++11 scope used in this course.
Understand its lifetime, ownership, type, and ordering consequences.
Compile with warnings and prefer the smallest form that makes the rule obvious.
10. Self-Check Questions
Easy — What does exception safety describe when an operation fails? Does
void cleanup() noexceptautomatically catch every exception?Medium — Read the small example described above. What value or state should it print, and which rule produces that result?
Hard — Find and explain the subtle bug in this situation: Letting an exception escape a
noexceptfunction callsstd::terminate, so the specifier must describe a real guarantee. What is the smallest C++11-safe correction?