User Tools

Site Tools


c_-_c_streams:istrstream_exceptions

C - C++ Streams - istream exceptions

#include <iostream>
#include <cstdlib>
 
namespace MyLib {
  double readAndProcessSum (std::istream&);
}
 
 
int main()
{
  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;
  }
}
c_-_c_streams/istrstream_exceptions.txt · Last modified: 2020/07/15 10:30 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki