Если я наследовался станд.:: исключение?

Я - возраст студента университета 19, но я начал изучать Emacs хороший 2-3 несколько лет назад. Я попробовал vi (m) некоторое время, но я не мог выдержать модальную модель редактирования.

До моего введения в Emacs, я использовал Gedit и нано, чтобы сделать все мое кодирование.

96
задан John M Gant 3 November 2009 в 19:11
поделиться

11 ответов

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

Изменить: как отметили Мартин и другие, вы действительно хотите наследоваться от одного из подклассов std :: exception , объявленных в заголовке .

69
ответ дан 24 November 2019 в 05:38
поделиться

Если все ваши возможные исключения происходят от std :: exception , ваш блок catch может просто catch (std :: exception & e) и быть гарантирован захват всего.

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

3
ответ дан 24 November 2019 в 05:38
поделиться

Поскольку язык уже генерирует std :: exception, вам все равно нужно перехватить его, чтобы обеспечить достойный отчет об ошибках. Вы также можете использовать ту же уловку для всех собственных неожиданных исключений. Кроме того, почти любая библиотека, генерирующая исключения, будет наследовать их от std :: exception.

Другими словами, его либо

catch (...) {cout << "Unknown exception"; }

, либо

catch (const std::exception &e) { cout << "unexpected exception " << e.what();}

И второй вариант определенно лучше.

3
ответ дан 24 November 2019 в 05:38
поделиться

Есть одна проблема с наследованием, о которой вам следует знать, - это нарезка объектов. Когда вы пишете throw e; , выражение throw инициализирует временный объект, называемый объектом исключения, тип которого определяется удалением любых cv-квалификаторов верхнего уровня из статического типа операнда бросить . Это может быть не то, что вы ожидаете. Пример проблемы вы можете найти здесь .

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

6
ответ дан 24 November 2019 в 05:38
поделиться

Причина, по которой вы можете захотеть унаследовать от std :: exception , заключается в том, что он позволяет вам генерировать исключение, которое перехватывается в соответствии с этим классом, например:

class myException : public std::exception { ... };
try {
    ...
    throw myException();
}
catch (std::exception &theException) {
    ...
}
9
ответ дан 24 November 2019 в 05:38
поделиться

Вы должны унаследовать от boost :: exception . Он предоставляет гораздо больше возможностей и понятные способы передачи дополнительных данных ... конечно, если вы не используете Boost , проигнорируйте это предложение.

12
ответ дан 24 November 2019 в 05:38
поделиться

Однажды я участвовал в очистке большой кодовой базы, куда предыдущие авторы добавляли целые числа, HRESULTS, std :: string, char *, случайные классы ... везде разные вещи; просто назовите тип, и он, вероятно, был куда-то брошен. И вообще никакого общего базового класса. Поверьте, все стало намного аккуратнее, когда мы дошли до того, что все брошенные типы имели общую базу, которую мы могли поймать и знать, что ничего не пройдет. Поэтому, пожалуйста, сделайте себе (и тем, кому придется поддерживать ваш код в будущем) одолжение и сделайте это с самого начала.

12
ответ дан 24 November 2019 в 05:38
поделиться

Причина наследования от std :: exception - это «стандартный» базовый класс для исключений, поэтому другие люди в команде, например, могут ожидать это и catch base std :: exception .

Если вам нужно удобство, вы можете унаследовать от std :: runtime_error , который предоставляет std :: string конструктор.

17
ответ дан 24 November 2019 в 05:38
поделиться

Разница: std :: runtime_error vs std :: exception ()

Вы должны наследовать от него или нет - решать вам. Стандартный std :: exception и его стандартные потомки предлагают одну возможную структуру иерархии исключений (разделение на субиерархию logic_error и субиерархию runtime_error ) и один возможный интерфейс объекта исключения. Если нравится - пользуйтесь. Если по какой-то причине вам нужно что-то другое - определите свою собственную структуру исключений.

5
ответ дан 24 November 2019 в 05:38
поделиться

Проблема с std :: exception заключается в том, что нет конструктора (в стандартных совместимых версиях), который принимает сообщение.

В результате я предпочитаю унаследовать от std :: runtime_error . Это получено из std ::

40
ответ дан 24 November 2019 в 05:38
поделиться

Кажется, что Грубер пересмотрел свое регулярное выражение :

\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»“”‘’\s]))

Работает просто прекрасно сейчас .

-121--3186117-

Найдено. Может потребоваться добавить виртуальный атрибут в модель.

.........

attr_accessor :not_on_db
.........

validates_presence_of     :not_on_db,
validates_length_of       :not_on_db,    :within => 1..5
.........
-121--3879911-

Да следует получить из std:: exception .

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

9
ответ дан 24 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: