Зачем перехватывать исключение как ссылку на 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 где-нибудь еще (я говорю СЛЕДУЕТ, потому что на самом деле это не так сильно влияет на поверхность, может помочь компиляторам, а также помогает кодировщикам правильно использовать ваш код и не делать то, что им не нужно)

обработчики исключений могут быть специфичными для платформы и могут помещать исключения в забавные места, потому что они не ожидают их изменения?