Зачем перехватывать исключение как ссылку на const?
Я слышал и читал много раз, что лучше поймать исключение как ссылку на-const, а не как ссылку. Почему
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
лучше, чем
try {
// stuff
} catch (std::exception& e) {
// stuff
}
Ответы
Ответ 1
Вам нужно:
- ссылка, так что вы можете получить доступ к исключению полиморфно
- a const для повышения производительности и сообщить компилятору, что вы не собираетесь изменять объект
Последнее не так важно, как первое, но единственная настоящая причина для отказа от const должна означать, что вы хотите делать изменения в исключении (обычно полезно только в том случае, если вы хотите перебросить его с добавленным контекстом в более высокий уровень).
Ответ 2
В принципе нет причин.
Объекты исключений живут в своем собственном пространстве памяти & dagger; поэтому вам не нужно беспокоиться о том, чтобы улавливать исключения, созданные во временных выражениях.
Все, что вы делаете, обещает, что вы не будете модифицировать объект исключения, но поскольку объекты исключений должны иметь неизменяемый интерфейс & Dagger; здесь действительно нет ничего практичного.
Однако, это может заставить вас чувствовать себя тепло и уютно, когда вы его читаете; что это для меня!
& dagger; У них есть собственный, специальный, потоковый локальный стек.
& Dagger; Отказ от ответственности: Boost.Exception разрывает это, чтобы делать фанки и добавлять детали исключения, пост-строительство. Но это хакерство!
Ответ 3
Он сообщает компилятору, что вы не будете вызывать какую-либо функцию, которая модифицирует исключение, что может помочь оптимизировать код. Наверное, это не имеет большого значения, но стоимость его тоже очень мала.
Ответ 4
По той же причине вы используете const.
Ответ 5
Вы собираетесь изменить исключение? если нет, это может быть const. по той же причине вы ДОЛЖНЫ использовать const где-нибудь еще (я говорю СЛЕДУЕТ, потому что на самом деле это не так сильно влияет на поверхность, может помочь компиляторам, а также помогает кодировщикам правильно использовать ваш код и не делать то, что им не нужно)
обработчики исключений могут быть специфичными для платформы и могут помещать исключения в забавные места, потому что они не ожидают их изменения?