Я много раз слышал и читал, что лучше ловить исключение как ссылку на const, чем как ссылку. Почему:
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
лучше чем:
try {
// stuff
} catch (std::exception& e) {
// stuff
}
Ответы:
Тебе нужно:
Последнее не так важно, как первое, но единственная реальная причина для удаления const - это сигнализировать о том, что вы хотите внести изменения в исключение (обычно полезно, только если вы хотите повторно выбросить его с добавленным контекстом на более высокий уровень) .
std::exception, what()функции). Если вы поймаете по значению, вы не сможете вызвать эту функцию и получить исходную информацию об исключении.
В принципе, нет никаких причин.
Объекты-исключения живут в собственном пространстве памяти † поэтому вам не нужно беспокоиться о перехвате исключений, созданных во временных выражениях.
Все, что вы делаете, - это обещание, что вы не будете изменять объект исключения, но поскольку объекты исключения должны иметь неизменяемый интерфейс ‡ , на самом деле здесь нет ничего практичного.
Однако, когда вы ее читаете, вам может стать тепло и уютно - вот как это для меня!
† У них есть свой собственный, специальный стек, локальный для потока.
‡ Отказ от ответственности: Boost.Exception нарушает это, чтобы делать забавные вещи и добавлять детали исключения после создания. Но это же хакерство!
Exception objects live in their own memory space? Вы можете что-нибудь почитать по этому поводу?
вы собираетесь изменить исключение? в противном случае это также может быть const. по той же причине, по которой вы ДОЛЖНЫ использовать const где-либо еще (я говорю СЛЕДУЕТ, потому что на самом деле это не имеет большого значения на поверхности, может помочь компиляторам, а также помочь кодерам правильно использовать ваш код и не делать того, чего они не должны)
обработчики исключений, могут быть специфичными для платформы и могут помещать исключения в забавные места, потому что они не ожидают их изменения?
По той же причине вы используете const.