Вопрос, связанный с выводом стандартных классов исключений - PullRequest
4 голосов
/ 31 января 2009
/* user-defined exception class derived from a standard class for exceptions*/

class MyProblem : public std::exception {

public:

    ...

    MyProblem(...) { //special constructor
    }

    virtual const char* what() const throw() {
    //what() function
    ...
    }

};

...

void f() {
...

//create an exception object and throw it

throw MyProblem(...);

...


}

Мой вопрос: почему после чего () происходит "const throw ()"? Обычно, если есть throw (), это означает, что функция перед throw () может бросить исключение. Однако, почему здесь происходит бросок?

Ответы [ 3 ]

8 голосов
/ 31 января 2009

Пустые скобки в "throw()" означают, что функция не выдает.

4 голосов
/ 31 января 2009

const - это отдельная проблема для throw ().
Это указывает на то, что это метод const. Таким образом, вызов этого метода не изменит состояние объекта.

throw () означает, что метод не будет генерировать никаких исключений.

Для USER этого метода метод будет возвращаться только обычным способом, и вам не нужно беспокоиться об исключениях, генерирующих вызовы.

В IMPLEMENTER этого метода есть о чем беспокоиться.
В отличие от Java, это не ограничение времени компиляции, а ограничение времени выполнения. Если разработчик запишет функцию так, что он случайно выбрасывает исключение из метода, тогда среда выполнения остановит работу приложения (без разматывания стека, без деструкторов и т. Д.).

Но соглашение заключается в том, что разработчик примет дополнительные меры предосторожности, чтобы перехватить все внутренние исключения.

PS
Вы можете захотеть получить от std :: runtime_error

(от Comment@onebyone.livejournal.com): Не совсем.
Спецификатор no throw активно используется. Это признак исключительной безопасности, демонстрирующий, что метод обеспечивает безбросовую гарантию

С другой стороны, другие спецификаторы исключений не используются, поскольку они слишком опасны. Если вы ошиблись, это приведет к закрытию приложения через (std :: непредвиденный). Действие по умолчанию - завершение приложения без разматывания стека и без очистки с помощью деструкторов объектов. В MHOP это вряд ли когда-либо желательно.

3 голосов
/ 31 января 2009

const квалифицирует функцию what(), говоря, что она не изменяет внутреннюю структуру объекта исключения.

throw() означает, что оно также не вызывает исключения - как отмечают OneByOne и Checkers.

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

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