Блоки 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), это будет только ссылка... не создается новый объект и не будет вызван конструктор... так формально немного над головой... позже лучше использовать...