#include #include #include #include #include class my_num_put : public std::num_put< char > { public: explicit my_num_put(std::size_t n) : std::num_put< char >(n) {} iter_type do_put(iter_type, std::ios_base&, char_type, double) const { std::cout << "Throwing an exception" << std::endl; throw std::logic_error("my error"); } }; void test(std::ostream& strm) { double x = 1.0; try { strm << x; if (!strm.good()) std::cout << "Stream is not good" << std::endl; } catch (std::logic_error& e) { std::cout << "Caught logic_error: " << e.what() << std::endl; } catch (std::ios_base::failure& e) { std::cout << "Caught ios_base::failure: " << e.what() << std::endl; } } int main(int, char*[]) { std::ostringstream strm1; strm1.imbue(std::locale(std::locale::classic(), new my_num_put(0))); test(strm1); std::ostringstream strm2; strm2.imbue(std::locale(std::locale::classic(), new my_num_put(0))); strm2.exceptions(~std::ios_base::goodbit); test(strm2); return 0; }