2015-02-04 3 views
1

Я новичок в C++. Я видел несколько примеров кода, которые используют блоки catch, в которых исключение поймано по значению. Например:Ловля объектов по ссылке

catch(SomeClass e) 

Я также видел некоторые примеры, которые ловят по ссылке:

catch(const std:: out_of_range& e) 

Я полагаю, что в случае, если исключения перехватываются ссылки, он должен быть на const ссылки.

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

Спасибо!

+0

Подумайте об этом: это как взять параметр, когда вы примете полиморфный параметр по значению? –

ответ

3

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

Можно модифицировать пойманный объект и повторно бросить его, например, чтобы вы не имели, чтобы сделать его ссылкой const. Но это тоже хорошая идея.

6

Это рекомендуется перехватывать исключения по ссылке по двум причинам:

  1. Ловля исключения по значению будет в конечном итоге сделать копию брошенного объекта исключения (так же, как передать параметр сделает копия этого объекта). Несмотря на то, что обработка исключений может быть немного медленной, все равно стоит попытаться избежать этой неэффективности.

  2. Если вы бросаете исключение производного типа и поймать базовый тип по значению, вы будете ломтик исключения таким же образом, что прохождение производного типа в зависимости от значения будет порезать этот объект. Это может привести к неправильному или необычному поведению в программе.

Надеюсь, это поможет!

Смежные вопросы