try { //... } catch (std::runtime_error& e) { std::cout << "Runtime error: " << e.what() << std::endl; } catch (...) { std::cout << "Unknown exception!" << std::endl; }
You have this piece of code repeated dozens of times, which is not really a Good Thing(tm)... A little C++ trick can help you avoid those repetitions: (1) factor the common code into a single function or method that rethrows the active exception and catches it immediately, and (2) catch all exceptions at the call sites and call this handler!
#include <iostream> #include <stdexcept> void exception_handler() { try { throw; //rethrow the current exception } catch (std::runtime_error& e) { std::cout << "Runtime error: " << e.what() << std::endl; } catch (...) { std::cout << "Unknown exception!" << std::endl; } } int main() { try { throw std::runtime_error("unable to comply..."); } catch (...) { exception_handler(); } try { throw 1; } catch (...) { exception_handler(); } return 0; }
You must be careful to not call
exception_handler()
outside a catch
clause: the trow
statement calls terminate()
if there is no active exception to rethrow!You may wonder if one could use the
std::uncaught_exception()
function to protect against this. void exception_handler() { try { if (!std::uncaught_exception()) { return; // Nothing to rethrow... } throw; //rethrow the current exception } ... }
But this does not work:
uncaught_exception()
"returns true
after completing evaluation of the object to be thrown until completing the initialization of the exception-declaration in the matching handler", as the standard says. And when exception_handler
is entered, this is generally from the catch
clause, and the exception has thus been caught... Your handler would now simply swallow all the exceptions!...Actually,
uncaught_exception
is pretty much useless...
Excellent. I just made use of this trick.
ReplyDelete