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()
в конце?
Ответы
Ответ 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/