Подтвердить что ты не робот

Throw() после объявления функции в С++ exception struct?

Вот от http://www.tutorialspoint.com/cplusplus/cpp_exceptions_handling.htm

#include <iostream>
#include <exception>
using namespace std;

struct MyException : public exception
{
  const char * what () const throw ()
  {
    return "C++ Exception";
  }
};

Я понимаю, что const после what означает, что функция не изменяет никаких члены структуры, но что означает throw() в конце?

4b9b3361

Ответ 1

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

В С++ 11 вместо этого вы должны использовать noexcept. Старая спецификация броска устарела.

Ответ 2

throw () - это спецификатор исключения, который объявляет, что what() никогда не будет генерировать исключение. Однако это устарело на С++ 11 (см. http://en.wikipedia.org/wiki/C++11). Чтобы указать, что функция не генерирует никакого исключения, ключевое слово noexcept существует в С++ 11.

Ответ 3

Вы можете указать тип, который будет выброшен, чтобы, если он выбрасывает что-либо но этот тип (например, int), тогда функция вызывает std::unexpectedвместо поиска обработчика или вызова std::terminate.

В этом случае он не выдаст никаких исключений, что важно для what().

Если этот спецификатор throw оставлен пустым без типа, это означает, что std::unexpected вызывается для любого исключения. Функции без броска specifier (регулярные функции) никогда не вызывают std::unexpected, но следуют нормальный путь поиска обработчика исключений.

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

Смотрите здесь: http://www.cplusplus.com/doc/tutorial/exceptions/