Блоки catch С++ - исключение catch по значению или ссылке?

Возможный дубликат:
catch исключение указателем на С++

Я всегда поймаю исключения по значению. например

try{
...
}
catch(CustomException e){
...
}

Но я натолкнулся на код, который вместо этого имел catch(CustomException &e). Является ли это a) штраф b) неправильным c) серой областью?

Ответ 1

Стандартная практика для исключений в С++ - это...

Выбросьте значение, поймайте по ссылке

Захват по значению является проблематичным перед иерархиями наследования. Предположим, что для вашего примера существует другой тип MyException, который наследует от CustomException и переопределяет такие элементы, как код ошибки. Если тип MyException был брошен, ваш блок catch заставит его преобразовать в экземпляр CustomException, который приведет к изменению кода ошибки.

Ссылки

Ответ 2

Захват по значению будет срезать объект исключения, если исключение относится к производному типу к типу, который вы улавливаете.

Это может быть или не иметь значения для логики в вашем блоке catch, но нет оснований не ловить ссылку const.

Обратите внимание, что если вы throw; без параметра в блоке catch, исходное исключение будет отвергнуто, поймаете ли вы фрагментированную копию или ссылку на объект исключения.

Ответ 3

Если вы не хотите возиться с исключением, вы обычно должны использовать ссылку const: catch (const CustomException& e) { ... }. Компилятор имеет дело с временем жизни брошенного объекта.

Ответ 4

in (CustomException e) создается новый объект CustomException... поэтому он будет вызываться в while (CustomException & e), это будет только ссылка... не создается новый объект и не будет вызван конструктор... так формально немного над головой... позже лучше использовать...