C ++ catch blocks – captura exceção por valor ou referência?

Duplicar Possível:
captura exceção por ponteiro em C ++

Eu sempre pego exceções por valor. por exemplo

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

Mas me deparei com algum código que, em vez disso, tinha catch(CustomException &e) . Isso é a) bem b) errado c) uma área cinza?

A prática padrão para exceções em C ++ é …

Jogue por valor, pegue por referência

Capturar por valor é problemático em face das hierarquias de inheritance. Suponha, para o seu exemplo, que exista outro tipo MyException que herda do CustomException e substitua itens como um código de erro. Se um tipo MyException fosse lançado, seu bloco catch faria com que ele fosse convertido em uma ocorrência CustomException que faria com que o código de erro fosse alterado.

Capturar por valor dividirá o object de exceção se a exceção for de um tipo derivado para o tipo que você capturar.

Isso pode ou não importar para a lógica em seu bloco catch, mas há poucas razões para não pegar por referência const.

Note que se você throw; sem um parâmetro em um bloco catch, a exceção original é relançada independentemente de você ter ou não capturado uma cópia dividida ou uma referência ao object de exceção.

A menos que você queira mexer na exceção, você deve normalmente usar uma referência const: catch (const CustomException& e) { ... } . O compilador lida com o tempo de vida do object lançado.

in (CustomException e) novo object de CustomException é criado … então seu construtor será chamado enquanto em (CustomException & e) será apenas a referência … não será criado um novo object e nenhum construtor será chamado … tão formal é pouco sobrecarga … depois é melhor usar …