Things go wrong
Files are missing, networks drop, users type nonsense, divisions land on zero. A robust program anticipates errors and handles them, instead of crashing in the user's face. C++ provides a try/catch (or equivalent) mechanism that lets a block of code "throw" an error which a surrounding block can catch and recover from.
try {
throw std::runtime_error("Something broke");
} catch (const std::exception &e) {
std::cerr << e.what() << "\n";
}When to catch
Only catch errors you actually know how to recover from. Catching and then ignoring an error is the single most common cause of mysterious bugs in production systems — the program keeps going as if everything were fine while the data is silently broken.
Logging
Whenever you catch an error, log it with enough context (what you were trying to do, with what inputs) that someone reading the log later can understand what happened. Modern apps live or die by the quality of their logs.