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