Возможный дубликат:
исключение выгоды указателем в C++Я всегда ловлю исключения значением. например,
try{ ... } catch(CustomException e){ ... }
Но я столкнулся с некоторым кодом, который вместо этого имел
catch(CustomException &e)
вместо этого. Является этот a) прекрасный b) неправильным c) серая область?
Стандартная практика для исключений в C ++:
Выбрасывать по значению, ловить по ссылке
Перехват по значению проблематичен. иерархий наследования. Предположим для вашего примера, что существует другой тип MyException
, который наследуется от CustomException
и переопределяет такие элементы, как код ошибки. Если был сгенерирован тип MyException
, ваш блок catch преобразовал бы его в экземпляр CustomException
, что привело бы к изменению кода ошибки.
При перехвате по значению будет срез объекта исключения, если исключение является производным от типа, который вы перехватываете.
Это может иметь значение, а может и не иметь значения для логики вашего блока catch, но есть небольшая причина не ловить по константной ссылке.
Обратите внимание, что если вы выбрасываете;
без параметра в блоке перехвата, исходное исключение генерируется повторно независимо от того, поймали ли вы нарезанную копию или ссылку на объект исключения.
Если вы не хотите возиться с исключением, обычно следует использовать константную ссылку: catch (const CustomException & e) {...}
. Компилятор обрабатывает время жизни брошенного объекта.
в ] (CustomException e)
Создается новый объект CustomException ... поэтому его конструктор будет вызываться, в то время как в (CustomException & e) он будет просто ссылкой ... не создается новый объект и не будет вызываться конструктор .. . так формально это немного накладные расходы ... позже лучше использовать ...