Зачем ловить исключение как ссылка на const? - PullRequest
70 голосов
/ 27 января 2010

Я много раз слышал и читал, что лучше ловить исключение как ссылку на константу, а не как ссылку. Почему

try {
    // stuff
} catch (const std::exception& e) {
    // stuff
}

лучше чем

try {
    // stuff
} catch (std::exception& e) {
    // stuff
}

Ответы [ 5 ]

54 голосов
/ 27 января 2010

Вам нужно:

  • ссылка, чтобы вы могли полиморфно получить доступ к исключению
  • const для увеличения производительности и сообщаем компилятору, что вы не собираетесь изменять объект

Последний не так важен , как первый, но единственная реальная причина для отказа от const - это сигнал о том, что вы хотите внести изменения в исключение (обычно полезно, только если вы хотите перебросить это с добавленным контекстом в более высокий уровень).

27 голосов
/ 23 августа 2013

В принципе нет никаких оснований.

Объекты исключений находятся в своем собственном пространстве памяти & dagger; , поэтому вам не нужно беспокоиться о перехвате исключений, созданных во временных выражениях.

Все, что вы делаете, - это обещание, что вы не будете изменять объект исключения, но поскольку объекты исключений должны иметь неизменный интерфейс & Dagger; , здесь нет ничего практичного.

Тем не менее, вы можете почувствовать тепло и уют, когда читаете его & mdash; вот как это для меня!

& dagger; У них есть свой собственный специальный стек локальных потоков.
& Dagger; Отказ от ответственности: Boost.Exception разбивает это, чтобы сделать что-то напуганное и добавить детали исключения, пост-строительство. Но это хакерство!

5 голосов
/ 27 января 2010

Он сообщает компилятору, что вы не будете вызывать никакую функцию, которая изменяет исключение, что может помочь оптимизировать код. Вероятно, это не имеет большого значения, но стоимость этого тоже очень мала.

1 голос
/ 27 января 2010

вы собираетесь изменить исключение? если нет, это может быть также постоянным. По той же причине, по которой вы ДОЛЖНЫ использовать const где-либо еще (я говорю СЛЕДУЕТ, потому что на самом деле это не имеет большого значения, может помочь компиляторам, а также помочь кодировщикам правильно использовать ваш код и не делать того, чего не должны)

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

0 голосов
/ 27 января 2010

По той же причине вы используете const.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...