2015-12-18 12 views
1

Здесь у меня есть streambuf, ostream Структура (изменено отсюда http://wordaligned.org/articles/cpp-streambufs), где я пытаюсь сделать throw с двух точек в коде. Но я никогда не могу поймать эти исключения в main(), и программа выйдет нормально. В чем причина этого?C++ STL streambuf обработка исключений

#include <iostream> 
#include <fstream> 
#include <streambuf> 

using namespace std; 

class teebuf: public streambuf 
{ 
public: 
     teebuf(streambuf * sb1, streambuf * sb2) 
     : sb1(sb1) , 
     sb2(sb2) 
    { } 
private: 
    virtual int overflow(int c) { 
     if (c == EOF) 
      return !EOF; 
     else { 
//Throwing here 
      throw exception(); 
      int const r1 = sb1->sputc(c); 
      int const r2 = sb2->sputc(c); 
      return r1 == EOF || r2 == EOF ? EOF : c; 
     } 
    } 

    virtual int sync() { 
//Throwing here 
     throw exception(); 
     int const r1 = sb1->pubsync(); 
     int const r2 = sb2->pubsync(); 
     return r1 == 0 && r2 == 0 ? 0 : -1; 
    } 
private: 
    streambuf * sb1; 
    streambuf * sb2; 
}; 

class teestream : public ostream 
{ 
public: 
    teestream(ostream & o1, ostream & o2); 
private: 
    teebuf tbuf; 
}; 

teestream::teestream(ostream & o1, ostream & o2) 
    : std::ostream(&tbuf) , 
     tbuf(o1.rdbuf(), o2.rdbuf()) 
{ } 

int main() { 
    ofstream log("hello-world.log"); 
    teestream tee(cout, log); 
    try { 
     tee << "Hello, world!\n"; 
    } catch(...) { 
//Catching here 
     cerr << "Exception" << endl; 
    } 
    return 0; 
} 

ответ

3

Потоки настроены по умолчанию, чтобы иметь маску экслюзивного захвата всего. Если вы хотите использовать исключения для распространения через потоки, вам нужно установить маску исключений, чтобы это можно было сделать.

В частности вам необходимо установить std::ios_base::badbit получить исключения вызваны повторно (после std::ios_base::badbit устанавливается на потоке):

stream.exceptions(std::ios_base::badbit);