Написание пользовательских исключений в переполнении стека

Я пришел из Ruby и Java и недавно начал изучать C ++.

Хотя мои первоначальные попытки создания пользовательских исключений путем простого создания подкласса класса исключений не увенчались успехом, я обнаружил на сайте следующий пример:

class Exception : public exception
{
public:
Exception(string m="exception!") : msg(m) {}
~Exception() throw() {}
const char* what() const throw() { return msg.c_str(); }

private:
string msg;
};

Мое понимание семантики C ++ в настоящее время не очень зрелое, и я хотел бы лучше понять, что здесь происходит.

В заявлении const char* what() const throw() что делает часть const throw() делать, и что это за конструкция программирования?

Кроме того, какова цель и цель throw() в спецификации деструктора ~Exception() и почему мне нужно иметь спецификацию деструктора, хотя мне не нужно, чтобы она что-то конкретно делала? Не должен destructor наследовать от исключения будет достаточно?

6

Решение

const после того, как метод объявляет, что метод не изменяет объект. (Существуют исключения, и обычно оно используется для обозначения «не видоизменяет объект внешне видимым образом.)

throw() после объявления метода указывается исключение; это похоже на throws E1, E2 спецификации исключений, которые вы видите в Java. Однако в C ++ спецификации исключений не проверяются во время компиляции и, как правило, считаются бесполезными (в настоящее время они устарели). throw() является единственной полезной формой, означающей, что функция объявляет, что она не должна выдавать исключение (и если это происходит, это логическая ошибка, и программа вызовет обработчик непредвиденных исключений, по умолчанию завершая программу).

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

13

Другие решения

В настоящее время вы имеете дело с некоторыми стилями C ++!
Поэтому, когда вы хотите на самом деле иметь exception-объект вы можете использовать std::exception, что объясняется здесь на cppreference.

Но так как вы можете бросить и поймать все в C ++, вы можете даже определить свой собственный класс исключений или использовать более базовые аспекты, например,

try  {
throw("S0M3, M4YB3 CR1PT1C STR1NG!");
} catch(char const* exceptStr) {
SomeFuncThatDecodesTheString(exceptStr);
}

Ваши другие темы — это скорее своего рода стиль или стандарт:

  • Пустой деструктор, как ~FooClass() {} Есть только два шоу «Я действительно ничего не делаю!» Иногда они также могут быть полезны, когда вы используете строгую систему для написания ваших классов (например, сначала публичное пространство, включая сначала стандартный ctor и стандартный dtor в качестве второй функции …), чтобы заставить вас (или некоторых других) другой кодер), чтобы записать в существующие фигурные скобки / функции и, следовательно, не разрушая ваш святой порядок 🙂
  • Вы можете написать throw() за классами для страхования другим людям, что класс только бросает исключения типов, указанных в параграфах. Поэтому функция void FooFunc() throw(int,char) должен только бросить Интс а также символы. И пустой throw() это просто на самом деле сказать «Эй, кодер, я ничего не бросаю!». Вы часто найдете это в стандартной библиотеке C ++, поскольку вы (в основном) можете просматривать только прототипы, а не исходный код. Кстати throw(someType(s)) может быть ложью. Функция может кинь любой другой тип или просто ничего! Но не будьте лжецом, когда вы используете это;)

РЕДАКТИРОВАТЬ:

Я хотел добавить, что noexcept можно (так как C ++ 11) также используется для объявления функции, а не для исключения. Это более понятно, чем throw(),

LG Ntor

3

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

Деструкторы в C ++ не наследуются. Если вы не напишите свой собственный деструктор, то компилятор автоматически сгенерирует для вас деструктор. Этот деструктор вызовет деструктор базового класса, если такой класс существует.

const спецификатор в Exception::what() объявление означает, что этот метод может быть вызван для константных объектов типа Exception, throw() Спецификатор означает то же, что и для деструктора.

Вы должны получить книгу о C ++, это очень простые вопросы.

2
По вопросам рекламы [email protected]