Здравствуйте, LaptevVV, Вы писали:
LVV>А между тем и по стандарту и по Страуструпу должна вызываться unexpected. LVV>Я глючу — или это VC++ так реализован.
AFAIK VC до сих пор игнорирует спецификации исключений, выдавая в лучшем случае Compiler Warning (level 3) C4290. Хотя утверждается, что "пустые" спецификации они поддерживают... Еще была недавно интересная статья здесь.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L> Из чтения всяких книжек у меня почему-то сложилось убеждение, что наличие в спецификации std::bad_exception автоматически гарантирует при нарушении спецификации перевыброс std::bad_exception.
Не гарантирует.
L_L> Но только ни один из доступных мне компиляторов так не делает (icc, g++, icl, cl, bcc 6.0)
Comeau — как и предписано стандартом — тоже "сам" ничего не перевыбрасывает.
L_L> так вот вопрос, может, имеется в виду, что нужно обязательно set_unexpected вызвать дял этого?
Да. std::bad_exception "само" будет перевыброшено только в том случае, если (15.5.2/2):
1) оно указано в exception-specification соответствующей функции;
2) std::unexpected() выбросит какое-то исключение, не входящее в exception-specification.
std::unexpected() "сама" ничего не выбрасывает, а просто вызывает обработчик, установленный при помощи std::set_unexpected (18.6.2.4/2). Обработчик по умолчанию просто-напросто вызывает std::terminate() (18.6.2.2/3).
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Задумал я проверить обработку спецификации исключения в Visual Studio.net 2003
Пишу код
double Ha(double a, double b, double c)
{ if ((a>0)&&(b>0)&&(c>0)) // если параметры правильные
{ if ((a+b>c)&&(a+c>b)&&(b+c>a)) // если треугольник
{ double p = (a+b+c)/2; // вычисление высотыreturn 2*sqrt(p*(p-a)*(p-b)*(p-c))/a;
}
else throw"Не треугольник!"; // генерируем исключение
}
else throw"Неправильный параметр!"; // генерация исключения
}
int main()
{ try { // контролируемый блок
cout <<Ha(3,4,5)<< endl; // нормальное вычисление
cout <<Ha(1,2,3)<< endl; // генерирует исключение
cout <<Ha(1,0,3)<< endl; // не выполняется!
}
catch(const char *s) // обработка исключения
{ cout << s << endl;
}
}
Все — ништяк! Работает
Далее изменяю заголовок функции
double Ha(double a, double b, double c) throw()
Опять все работает!
А между тем и по стандарту и по Страуструпу должна вызываться unexpected.
Я глючу — или это VC++ так реализован.
Или надо где флажок проставить?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Ээээ, дак со спецификацией исключений всегда беда, даже у хороших компиляторов.
Ваш любимыт Саттер их проклинал и поносил в своей статейке. Кстати, в msdn загянули бы лучше по поводу того, реализованы они или нет в 2003.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Ээээ, дак со спецификацией исключений всегда беда, даже у хороших компиляторов. L_L>Ваш любимыт Саттер их проклинал и поносил в своей статейке. Кстати, в msdn загянули бы лучше по поводу того, реализованы они или нет в 2003.
Ага, спасибо. Сейчас так и сделаю, а то дом астарый стоит.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Меня вот другое интересует! Из чтения всяких книжек у меня почему-то сложилось убеждение, что наличие в спецификации std::bad_exception автоматически гарантирует при нарушении спецификации перевыброс std::bad_exception. Но только ни один из доступных мне компиляторов так не делает (icc, g++, icl, cl, bcc 6.0) — так вот вопрос, может, имеется в виду, что нужно обязательно set_unexpected вызвать дял этого?
Of course, the code must be complete enough to compile and link.
Здравствуйте, SchweinDeBurg, Вы писали:
SDB>Здравствуйте, LaptevVV, Вы писали:
LVV>>А между тем и по стандарту и по Страуструпу должна вызываться unexpected. LVV>>Я глючу — или это VC++ так реализован.
SDB>AFAIK VC до сих пор игнорирует спецификации исключений, выдавая в лучшем случае Compiler Warning (level 3) C4290. Хотя утверждается, что "пустые" спецификации они поддерживают... Еще была недавно интересная статья здесь.
О спасибо! Совсем новье!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Меня вот другое интересует! Из чтения всяких книжек у меня почему-то сложилось убеждение, что наличие в спецификации std::bad_exception автоматически гарантирует при нарушении спецификации перевыброс std::bad_exception. Но только ни один из доступных мне компиляторов так не делает (icc, g++, icl, cl, bcc 6.0) — так вот вопрос, может, имеется в виду, что нужно обязательно set_unexpected вызвать дял этого?
В 15.5.2-3 написано "...may be replaced...", а не "...must..." — вот они все и волынят.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Меня вот другое интересует! Из чтения всяких книжек у меня почему-то сложилось убеждение, что наличие в спецификации std::bad_exception автоматически гарантирует при нарушении спецификации перевыброс std::bad_exception. Но только ни один из доступных мне компиляторов так не делает (icc, g++, icl, cl, bcc 6.0) — так вот вопрос, может, имеется в виду, что нужно обязательно set_unexpected вызвать дял этого?
Тоже такое мнение из книжек сложилось, но не проверял. Да и в MSDN еще не смотрел.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
SDB>В 15.5.2-3 написано "...may be replaced...", а не "...must..." — вот они все и волынят.
Ага, я сам это увидел и у меня появилось впечатление, что may be потому что ты можешь заменить. Но, вроде как в статье написано что само по себе все делается
Of course, the code must be complete enough to compile and link.