2014-12-22 2 views
1

Я часто писать код, как это:О C++ vector :: push_back() исключения. Эллипсис полезен?

try 
{ 
    vec.push_back(0); 
} 
catch(const std::bad_alloc &) 
{ 
    ec=1; 
} 
catch(...) 
{ 
    ec=2; 
} 

ли многоточие улов полезным? Можете ли вы предоставить некоторые ссылки, где я могу найти все, что мне нужно знать об исключениях, создаваемых cin, vector, ifstream и т. Д.? Все C++ вещи ... Что-то вроде The Open Group Base спецификации Выпуск 7 (http://pubs.opengroup.org/onlinepubs/9699919799/), где вы можете найти функции имена, параметры, возвращаемые значения, флаги, Errno коды и т.д.

+1

Вы имеете в виду что-то вроде http://en.cppreference.com/? – user2393256

+2

Это объект, если объект push_back является объектом класса, создающим исключение при построении. –

+0

@ user2393256 О, спасибо, я забыл об этом! Но когда я смотрю http://en.cppreference.com/w/cpp/container/vector/push_back, я ничего не вижу о std :: bad_alloc. Может быть, я не ищу правильно? – Echren

ответ

2

Если многоточие поймать действительно полезный спорный ИМХО. Вы должны по крайней мере поймать std::exception для согласования более широкого случая

try { 
    vec.push_back(0); 
} 
catch(const std::bad_alloc &) { 
    ec=1; 
} 
catch(const std::exception &) { 
    ec=2; 
    // You can inspect what() for a particular reason, or even try to dynamic_cast<> 
    // to find out which specific exception was thrown. 
} 
catch(...) { 
    // You have no more type info here, this should be done for last resort (in the 
    // outermost scope) only. 
    ec=3; 
} 

Я оставил комментарии о преимуществах/недостатках

1

я не видел никаких ограничений на то, что могут быть отброшены исключения, но есть сноска 192, который содержит данное заявление:

... Реализации библиотек должны сообщать об ошибках путем исключения исключений или производных от стандартных классов исключений (18.6.2.1, 18.8, 19.2).

Это сноска на 17.6.5.12 [res.on.exception.handling] пункт 4, который также содержит эту фразу:

... Любые другие функции, определенные в стандартной библиотеки C++, что делать не имеют спецификации исключения, могут выдавать определенные исключения реализации, если не указано иное.

Кажется, любая приличная реализация может вызывать только исключения, полученные [косвенно] от std::exception. То есть я бы поймал std::exception const& и, возможно, сообщал строку what(), представленную этим исключением в какой-либо форме (например, зарегистрировав ее в подходящем месте назначения).

Смежные вопросы