неожиданные исключения - PullRequest
       2

неожиданные исключения

0 голосов
/ 05 октября 2011

Я пытаюсь использовать следующий код для проверки "set_unexpected ()".Я ожидаю, что код сгенерирует вывод наподобие:

In function f(), throw const char* object
Call to my_unexpected
Exception in main(): Exception thrown from my_unexpected

Но я получил ошибку времени выполнения: «Это приложение запросило среду выполнения, чтобы завершить его необычным способом»Итак, в чем будет проблема?Спасибо

struct E {
  const char* message;
  E(const char* arg) : message(arg) { }
};

void my_unexpected() {
  cout << "Call to my_unexpected" << endl;
  throw E("Exception thrown from my_unexpected");
}

void f() throw(E) {
  cout << "In function f(), throw const char* object" << endl;
  throw("Exception, type const char*, thrown from f()");
}


int _tmain(int argc, _TCHAR* argv[])
{
      set_unexpected(my_unexpected);
  try {
    f();
  }
  catch (E& e) {
    cout << "Exception in main(): " << e.message << endl;
  }
    return 0;

}

1 Ответ

1 голос
/ 05 октября 2011

Visual C ++ неправильно реализует спецификации исключений.Как указано здесь ,

Visual C ++ отходит от стандарта ANSI при реализации спецификаций исключений.

и, в частности,

throw(type) - Функция может выдать исключение типа type.Однако в Visual C ++ .NET это интерпретируется как throw(...).

Также здесь :

Спецификаторы исключений функций, отличные от throw() обрабатываются, но не используются.

Из-за этого ваш обработчик terminate никогда не вызывается, и поскольку в вашем коде нет обработчиков для const char *, исключение не перехватывается, и приложениезавершается ненормально.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...