Recover in C++
#include <iostream>
#include <stdexcept>
#include <functional>
// This function throws an exception.
void mayThrow() {
throw std::runtime_error("a problem");
}
int main() {
// In C++, we use try-catch blocks for exception handling.
// This is similar to the deferred function with recover in the original example.
try {
// The std::function wrapper allows us to catch any exception
// that might be thrown within the lambda.
std::function<void()> f = [] {
try {
mayThrow();
} catch (const std::exception& e) {
std::cout << "Caught exception. Error:\n" << e.what() << std::endl;
}
};
f();
// This code will run, unlike in the original example,
// because C++ exceptions are caught and don't stop program execution.
std::cout << "After mayThrow()" << std::endl;
} catch (...) {
// This catch-all block is analogous to a recover that catches any panic.
std::cout << "Caught unknown exception" << std::endl;
}
return 0;
}
In C++, we don’t have a direct equivalent to Go’s panic
and recover
mechanisms. Instead, we use exception handling with try
, catch
, and throw
.
The mayThrow
function simulates the mayPanic
function from the original example by throwing an exception instead of panicking.
In the main
function, we wrap our code in a try
block. Inside this block, we define a lambda function that calls mayThrow
and catches any exceptions it might throw. This lambda is wrapped in a std::function
to allow catching exceptions from within the lambda.
The catch
block in the lambda function is analogous to the recover
in the original example. It catches any std::exception
(which includes std::runtime_error
) and prints the error message.
Unlike in the original example, the code after mayThrow()
will actually execute in this C++ version, because exceptions are caught and don’t terminate the program.
The outer catch (...)
block is a catch-all that would handle any exceptions not caught by the inner catch block. This is somewhat analogous to a recover
that catches any panic.
To run this program:
$ g++ -std=c++11 exception_handling.cpp -o exception_handling
$ ./exception_handling
Caught exception. Error:
a problem
After mayThrow()
This example demonstrates how C++ uses exception handling to manage and recover from runtime errors, which is conceptually similar to Go’s panic and recover mechanism, albeit with different syntax and behavior.