второй. Вот моя попытка процитировать Саттера
«Брось по значению, поймайте по ссылке»
Научитесь catch
правильно: генерировать исключения по значению (не по указателю) и
лови их по ссылке (обычно на const
). Это комбинация
это лучше всего сочетается с семантикой исключений. При отбрасывании того же
исключение, предпочитайте просто throw;
throw e;
.
Вот полный Позиция 73. Бросок по значению, улов по ссылке.
Причина, по которой следует избегать перехвата исключений по значению, заключается в том, что он неявно создает копию исключения. Если исключение относится к подклассу, информация о нем будет потеряна.
try { throw MyException ("error") }
catch (Exception e) {
/* Implies: Exception e (MyException ("error")) */
/* e is an instance of Exception, but not MyException */
}
Функция перехвата по ссылке позволяет избежать этой проблемы, не копируя исключение.
try { throw MyException ("error") }
catch (Exception& e) {
/* Implies: Exception &e = MyException ("error"); */
/* e is an instance of MyException */
}