2013-06-19 11 views
0

Я узнал, что когда я указываю вид исключения, функция может вызывать , другие не могут быть выброшены, но когда я протестировал этот код, он не выполнил это правило.Нет ограничений на типы исключений throw

void foo(int i)throw(int) 
{ 
    if(i==2) 
    { 
     throw("exception"); 
    } 
} 
int main() 
{ 
    int i=2; 
    try 
    { 
     foo(i); 
    } 
    catch(const char* ex) 
    { 
     cout<<ex<<endl; 
    } 
    return 0; 
} 

Я что-то неправильно понял?

+1

Спецификации исключений никогда не были реализованы правильно большинством компиляторов, а C++ 11 осуждает их (не полностью, но по крайней мере в вашем случае использования). –

ответ

2

исключение спецификация работа нет как вы думал.

Вы все равно можете выбросить любое исключение, но если вы действительно разрешите что-либо, не включенное в список, вы можете позвонить по телефону unexpected() и terminate().

Общепринятой ошибкой считается, что спецификация исключения похожа на java one, это не так. Большинство руководств заявляют, что не используют их, возможно, вне throw(). Некоторые компиляторы указали, чтобы не реализовывать их (проверьте MSVC dox, если вы используете этот). Они устарели в текущем стандарте (C++ 11). __noexcept (true/false) переносит разумный вариант использования.

+0

Ну и почему я должен использовать спецификации исключений? каково их использование? – petric

+1

просто положить вам не следует. Прочтите эти данные: http://www.gotw.ca/publications/mill22.htm http://www.gotw.ca/gotw/082.htm http://boostjp.github.io/more/lib_guide.htm#Exception -спецификация –

+0

Thx mate thats realy helpfull. – petric