Я - возраст студента университета 19, но я начал изучать Emacs хороший 2-3 несколько лет назад. Я попробовал vi (m) некоторое время, но я не мог выдержать модальную модель редактирования.
До моего введения в Emacs, я использовал Gedit и нано, чтобы сделать все мое кодирование.
Основное преимущество заключается в том, что код, использующий ваши классы, не обязательно должен знать точный тип того, что вы бросаете на него
, а может просто поймать
std :: exception
.
Изменить: как отметили Мартин и другие, вы действительно хотите наследоваться от одного из подклассов std :: exception
, объявленных в заголовке
.
Если все ваши возможные исключения происходят от std :: exception
, ваш блок catch может просто catch (std :: exception & e)
и быть гарантирован захват всего.
После захвата исключения вы можете использовать метод what
для получения дополнительной информации. C ++ не поддерживает утиную типизацию, поэтому другой класс с методом what
потребует другого улова и другого кода для его использования.
Поскольку язык уже генерирует std :: exception, вам все равно нужно перехватить его, чтобы обеспечить достойный отчет об ошибках. Вы также можете использовать ту же уловку для всех собственных неожиданных исключений. Кроме того, почти любая библиотека, генерирующая исключения, будет наследовать их от std :: exception.
Другими словами, его либо
catch (...) {cout << "Unknown exception"; }
, либо
catch (const std::exception &e) { cout << "unexpected exception " << e.what();}
И второй вариант определенно лучше.
Есть одна проблема с наследованием, о которой вам следует знать, - это нарезка объектов. Когда вы пишете throw e;
, выражение throw инициализирует временный объект, называемый объектом исключения, тип которого определяется удалением любых cv-квалификаторов верхнего уровня из статического типа операнда бросить
. Это может быть не то, что вы ожидаете. Пример проблемы вы можете найти здесь .
Это не аргумент против наследования, это просто информация, которую необходимо знать.
Причина, по которой вы можете захотеть унаследовать от std :: exception
, заключается в том, что он позволяет вам генерировать исключение, которое перехватывается в соответствии с этим классом, например:
class myException : public std::exception { ... };
try {
...
throw myException();
}
catch (std::exception &theException) {
...
}
Вы должны унаследовать от boost :: exception . Он предоставляет гораздо больше возможностей и понятные способы передачи дополнительных данных ... конечно, если вы не используете Boost , проигнорируйте это предложение.
Однажды я участвовал в очистке большой кодовой базы, куда предыдущие авторы добавляли целые числа, HRESULTS, std :: string, char *, случайные классы ... везде разные вещи; просто назовите тип, и он, вероятно, был куда-то брошен. И вообще никакого общего базового класса. Поверьте, все стало намного аккуратнее, когда мы дошли до того, что все брошенные типы имели общую базу, которую мы могли поймать и знать, что ничего не пройдет. Поэтому, пожалуйста, сделайте себе (и тем, кому придется поддерживать ваш код в будущем) одолжение и сделайте это с самого начала.
Причина наследования от std :: exception
- это «стандартный» базовый класс для исключений, поэтому другие люди в команде, например, могут ожидать это и catch base std :: exception
.
Если вам нужно удобство, вы можете унаследовать от std :: runtime_error
, который предоставляет std :: string
конструктор.
Разница: std :: runtime_error vs std :: exception ()
Вы должны наследовать от него или нет - решать вам. Стандартный std :: exception
и его стандартные потомки предлагают одну возможную структуру иерархии исключений (разделение на субиерархию logic_error
и субиерархию runtime_error
) и один возможный интерфейс объекта исключения. Если нравится - пользуйтесь. Если по какой-то причине вам нужно что-то другое - определите свою собственную структуру исключений.
Проблема с std :: exception
заключается в том, что нет конструктора (в стандартных совместимых версиях), который принимает сообщение.
В результате я предпочитаю унаследовать от std :: runtime_error
. Это получено из std ::
Кажется, что Грубер пересмотрел свое регулярное выражение :
\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, которое затем может форматировать удобное для пользователя сообщение.