Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Поддерживает ли MSVC 2008 спецификацию исключений


Автор: zim22 5.4.2009, 11:10
Сабж.

Код

void fcn(int) throw(std::runtime_error) { }

 warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)

А хуже всего то, что я явно указываю, что функция вообще не будет кидать exception. Но компилятор компилит, только ещё один warning выплёвывает:
 warning C4297: 'fcn2' : function assumed not to throw an exception but does

Код
void fcn2() throw()
{
 throw std::logic_error("fcn2 log.err");
}

int _tmain(int argc, _TCHAR* argv[])
{
  try {
  //fcn(10);
  fcn2();
  } catch(...) { std::cout << "catch"; }
    return 0;
}



Автор: Lazin 5.4.2009, 11:28
Цитата(zim22 @  5.4.2009,  11:10 Найти цитируемый пост)
warning C4297: 'fcn2' : function assumed not to throw an exception but does

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

Цитата(zim22 @  5.4.2009,  11:10 Найти цитируемый пост)
warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)

в целях оптимизации, MSVC игнорирует все спецификации исключений кроме throw()
это не правиьно с точки зрения стандарта, но на практике как правило указывают только thrwo(), либо вообще не указывают, так что здесть нет проблемы smile 

Автор: zim22 5.4.2009, 11:34
Цитата(Lazin @  5.4.2009,  11:28 Найти цитируемый пост)
 так что здесть нет проблемы

а вот пример попроблемней.

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

MSVC и здесь нарушает стандарт....

Код
class Base {
public:
  virtual double f1(double) throw();
  virtual int f2(int) throw(std::logic_error);
  virtual std::string f3() throw(std::logic_error, std::runtime_error);
};
class Derived : public Base {
public:
  virtual double f1(double) throw(std::underflow_error); // error должен быть "по-хорошему". но всего лишь warning C4290
  virtual int f2(int) throw(std::logic_error);
  virtual std::string f3() throw();
};



Добавлено через 1 минуту и 49 секунд
Цитата(Lazin @  5.4.2009,  11:28 Найти цитируемый пост)
в целях оптимизации, MSVC игнорирует все спецификации исключений кроме throw()

ладно, я понял что студии на стандарт начхать...

Автор: Earnest 5.4.2009, 14:36
Цитата(zim22 @  5.4.2009,  12:34 Найти цитируемый пост)
ладно, я понял что студии на стандарт начхать... 

На самом деле, спасибо ей за это. Спецификация исключений - весьма спорный момент в стандарте. Теоретически звучит здорово, но в практической жизни больше мешает (вроде бы у Мейерса в последних реинкарнациях его советов интересные рассуждения на этот счет). Ну на самом деле, как можно, проектируя базовый класс, знать, что никогда в жизни его наследникам не придется бросать исключений в override-методах? Ну и т.д. В общем, если придерживаться спецификации исключений, получается примерно то, что получилось с языком АДА: целью было создать язык, на котором сложно писать неверные программы. А получился язык, на котором вообще сложно писать.

Автор: zim22 5.4.2009, 14:39
Цитата(Earnest @  5.4.2009,  14:36 Найти цитируемый пост)
у Мейерса в последних реинкарнациях его советов

Мейерс новую книжку издал?

Автор: Earnest 5.4.2009, 14:41
Уточняю: последних, котрые я читала. Не знаю, вроде нет, но реинкарнаций советов было по крайней мере 2. И они немного разные (советы) - концепции меняются на глазах.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)