#include #include // Function declarations int main(); void intermediate( int k ); void innermost( int k ); // Function definitions int main() { std::cout << "Entering main()" << std::endl; for ( int k{ 0 }; k <= 2; ++k ) { std::cout << std::endl << "Beginning loop body with k == " << k << std::endl; try { std::cout << " Calling intermediate(" << k << "):" << std::endl; intermediate( k ); std::cout << " Returned normally to main()" << std::endl; } catch ( std::invalid_argument const &e ) { std::cout << " >> Caught an exception in main(): " << e.what() << std::endl; } std::cout << "Ending loop body with k == " << k << std::endl; } std::cout << std::endl << "Leaving main()" << std::endl; return 0; } // Call innermost() and report when it returns. void intermediate( int k ) { std::cout << " Entering intermediate(" << k << ") and " "calling innermost(" << k << "):" << std::endl; innermost( k ); std::cout << " Back in intermediate(...) and returning" << std::endl; } // Throw an exception if k is odd. void innermost( int k ) { std::cout << " Entering innermost(" << k << ")" << std::endl; if ( k%2 == 1 ) { std::cout << " >> k is odd: throwing an exception" << std::endl; throw std::invalid_argument{ "k must be even" }; } std::cout << " k == " << k << " and returning from innermost(...)" << std::endl; } /*********************************************************** * Output: * * Entering main() * * Beginning loop body with k == 0 * Calling intermediate(0): * Entering intermediate(0) and calling innermost(0): * Entering innermost(0) * k == 0 and leaving innermost(...) * Back in intermediate(...) and returning * Returned normally to main() * Ending loop body with k == 0 * * Beginning loop body with k == 1 * Calling intermediate(1): * Entering intermediate(1) and calling innermost(1): * Entering innermost(1) * >> k is odd: throwing an exception * >> Caught an exception in main(): k must be even * Ending loop body with k == 1 * * Beginning loop body with k == 2 * Calling intermediate(2): * Entering intermediate(2) and calling innermost(2): * Entering innermost(2) * k == 2 and leaving innermost(...) * Back in intermediate(...) and returning * Returned normally to main() * Ending loop body with k == 2 * * Leaving main() * ***********************************************************/