Спецификация исключения
От: LaptevVV Россия  
Дата: 12.04.04 13:59
Оценка:
Задумал я проверить обработку спецификации исключения в 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++ так реализован.
Или надо где флажок проставить?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Спецификация исключения
От: Lorenzo_LAMAS  
Дата: 12.04.04 14:10
Оценка:
Ээээ, дак со спецификацией исключений всегда беда, даже у хороших компиляторов.
Ваш любимыт Саттер их проклинал и поносил в своей статейке. Кстати, в msdn загянули бы лучше по поводу того, реализованы они или нет в 2003.
Of course, the code must be complete enough to compile and link.
Re: Спецификация исключения
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 12.04.04 14:11
Оценка: 22 (2)
Здравствуйте, LaptevVV, Вы писали:

LVV>А между тем и по стандарту и по Страуструпу должна вызываться unexpected.

LVV>Я глючу — или это VC++ так реализован.

AFAIK VC до сих пор игнорирует спецификации исключений, выдавая в лучшем случае Compiler Warning (level 3) C4290. Хотя утверждается, что "пустые" спецификации они поддерживают... Еще была недавно интересная статья здесь.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[2]: Спецификация исключения
От: LaptevVV Россия  
Дата: 12.04.04 14:11
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Ээээ, дак со спецификацией исключений всегда беда, даже у хороших компиляторов.

L_L>Ваш любимыт Саттер их проклинал и поносил в своей статейке. Кстати, в msdn загянули бы лучше по поводу того, реализованы они или нет в 2003.

Ага, спасибо. Сейчас так и сделаю, а то дом астарый стоит.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Спецификация исключения
От: Lorenzo_LAMAS  
Дата: 12.04.04 14:14
Оценка:
Меня вот другое интересует! Из чтения всяких книжек у меня почему-то сложилось убеждение, что наличие в спецификации 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.
Re[2]: Спецификация исключения
От: LaptevVV Россия  
Дата: 12.04.04 14:19
Оценка:
Здравствуйте, SchweinDeBurg, Вы писали:

SDB>Здравствуйте, LaptevVV, Вы писали:


LVV>>А между тем и по стандарту и по Страуструпу должна вызываться unexpected.

LVV>>Я глючу — или это VC++ так реализован.

SDB>AFAIK VC до сих пор игнорирует спецификации исключений, выдавая в лучшем случае Compiler Warning (level 3) C4290. Хотя утверждается, что "пустые" спецификации они поддерживают... Еще была недавно интересная статья здесь.

О спасибо! Совсем новье!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Спецификация исключения
От: SchweinDeBurg Россия http://zarezky.spb.ru/
Дата: 12.04.04 14:21
Оценка:
Здравствуйте, 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..." — вот они все и волынят.
- Искренне ваш, Поросенок Пафнутий ~ ICQ#116846877
In Windows, there’s always a catch… © Paul DiLascia
Re[2]: Спецификация исключения
От: LaptevVV Россия  
Дата: 12.04.04 14:22
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Меня вот другое интересует! Из чтения всяких книжек у меня почему-то сложилось убеждение, что наличие в спецификации std::bad_exception автоматически гарантирует при нарушении спецификации перевыброс std::bad_exception. Но только ни один из доступных мне компиляторов так не делает (icc, g++, icl, cl, bcc 6.0) — так вот вопрос, может, имеется в виду, что нужно обязательно set_unexpected вызвать дял этого?

Тоже такое мнение из книжек сложилось, но не проверял. Да и в MSDN еще не смотрел.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Спецификация исключения
От: Lorenzo_LAMAS  
Дата: 12.04.04 14:23
Оценка:
SDB>В 15.5.2-3 написано "...may be replaced...", а не "...must..." — вот они все и волынят.

Ага, я сам это увидел и у меня появилось впечатление, что may be потому что ты можешь заменить. Но, вроде как в статье написано что само по себе все делается
Of course, the code must be complete enough to compile and link.
Re[2]: Спецификация исключения
От: Павел Кузнецов  
Дата: 13.04.04 04:45
Оценка: 8 (1)
Здравствуйте, 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).
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.