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]: Спецификация исключения
От: Павел Кузнецов  
Дата: 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).
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Спецификация исключения
От: 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[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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.