// namespace.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <iostream>
#include <cstdlib>


namespace MyLib {
	double readAndProcessSum (std::istream&);
}


int _tmain(int argc, _TCHAR* argv[])
{
	using namespace std;
	double sum;

	try {
		sum = MyLib::readAndProcessSum(cin);
	}
	catch (const ios::failure& error) {
		cerr << "I/O exception: " << error.what() << endl;
		return EXIT_FAILURE;
	}
	catch (const exception& error) {
		cerr << "standard exception: " << error.what() << endl;
		return EXIT_FAILURE;
	}
	catch (...) {
		cerr << "unknown exception" << endl;
		return EXIT_FAILURE;
	}

	// print sum
	cout << "sum: " << sum << endl;
}

#include <istream>

namespace MyLib {
	double readAndProcessSum (std::istream& strm)
	{
		using std::ios;
		double value, sum;

		// save current state of exception flags
		ios::iostate oldExceptions = strm.exceptions();

		/* let failbit and badbit throw exceptions
		* - NOTE: failbit is also set at end-of-file
		*/
		strm.exceptions (ios::failbit | ios::badbit);

		try {
			/* while stream is OK
			* - read value and add it to sum
			*/
			sum = 0;
			while (strm >> value) {
				sum += value;
			}
		}
		catch (...) {
			/* if exception not caused by end-of-file
			* - restore old state of exception flags
			* - rethrow exception
			*/
			if (!strm.eof()) {
				strm.exceptions(oldExceptions);  // restore exception flags
				throw;                           // rethrow
			}
		}

		// restore old state of exception flags
		strm.exceptions (oldExceptions);

		// return sum
		return sum;
	}
}