Блоки выгоды C++ - ловят исключение значением или ссылкой? [дубликат]

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

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

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

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

92
задан Community 23 May 2017 в 12:10
поделиться

4 ответа

Стандартная практика для исключений в C ++:

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

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

136
ответ дан 24 November 2019 в 06:31
поделиться

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

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

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

27
ответ дан 24 November 2019 в 06:31
поделиться

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

9
ответ дан 24 November 2019 в 06:31
поделиться

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

2
ответ дан 24 November 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: