Terminate вызывается после выброса экземпляра исключения, ядро ​​сброшено - PullRequest
0 голосов
/ 02 января 2019

Я перебираю исключения C ++ и сталкиваюсь с ошибкой, в которой я не уверен, почему она вызывает у меня проблемы:

 #include <iostream>
 #include <exception>

 class err : public std::exception
 {
 public:
      const char* what() const noexcept { return "error"; }
 };

 void f() throw()
 {
      throw err();
 }

 int main()
 {
      try
      {
           f();
      }
      catch (const err& e)
      {
           std::cout << e.what() << std::endl;
      }
 }

При запуске я получаю следующую ошибку времени выполнения:

 terminate called after throwing an instance of 'err'
   what():  error
 Aborted (core dumped)

Если полностью переместить логику try/catch в f(), т.е.

 void f() 
 {
      try
      {
           throw err();
      }
      catch (const err& e)
      {
            std::cout << e.what() << std::endl;
      }
 }

, и просто вызвать ее из main (без блока try / catch в main),тогда нет ошибки.Я что-то не понимаю, поскольку это связано с генерацией исключений из функций?

1 Ответ

0 голосов
/ 02 января 2019

throw() в void f() throw() является спецификацией динамического исключения и устарело с c ++ 11. Предполагалось, что он будет использован для перечисления исключений, которые может генерировать функция. Пустая спецификация (throw()) означает, что нет никаких исключений, которые может выдать ваша функция. Попытка вызвать исключение из такой функции вызывает std::unexpected, которая по умолчанию завершается.

Начиная с c ++ 11, предпочтительным способом указания того, что функция не может генерировать, является использование noexcept. Например void f() noexcept.

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