Catch All
Overview
If your try block calls a massive third-party library, it might throw a Custom Object Exception that you didn't even know existed. If you don't have a specific catch block for that exact data type, it will slip right past your defenses and crash the application.
C++ provides the Catch-All Handler (catch (...)). Using three literal dots (an ellipsis), this block acts as the ultimate safety net. It mathematically intercepts absolutely ANY exception, regardless of its data type, guaranteeing that your program will not crash. However, because it is generic, you have no way to access the actual Error Object to see what went wrong.
Syntax
#include <iostream>
void mysteryFunction() {
// Throws a raw boolean!
throw true;
}
int main() {
try {
mysteryFunction();
}
catch (int e) {
std::cout << "Caught an integer.\n";
}
// THE CATCH-ALL HANDLER
// Must always be placed at the absolute bottom of the catch chain!
catch (...) {
std::cout << "Caught an UNKNOWN exception! Surviving anyway!\n";
}
return 0;
}Common Pitfalls
- Placing the Catch-All at the top. C++ evaluates
catchblocks strictly top-to-bottom. If you placecatch (...)at the very top, it will intercept EVERY error immediately, making all your specific, usefulcatch(int)blocks beneath it mathematically unreachable 'Dead Code'.
Interview Questions
catch (...) provides no variable to inspect the error, why is it heavily used in enterprise C++ servers?In a production web server handling millions of clients, a single uncaught exception brings down the entire server, disconnecting everyone. The Catch-All is placed at the absolute top-level of the main loop. It may not know what went wrong, but it prevents the server from crashing, allowing it to drop the bad request and continue serving the next client.
Real-World Example
Using the Catch-All block to ensure a critical background thread never crashes.
#include <iostream>
void processNetworkThread() {
try {
// Massive, unpredictable third-party networking code
throw 3.14159; // Throws a double unexpectedly!
}
catch (const char* msg) {
std::cout << "Log: " << msg << "\n";
}
catch (...) {
// We have no idea what it threw, but we MUST keep the thread alive!
std::cout << "[CRITICAL WARNING] Unidentified exception suppressed.\n";
}
}
int main() {
processNetworkThread();
return 0;
}Check Your Knowledge
Test your understanding of Catch All with these quick questions.