C ++ catch blocks: captura la excepción por valor o referencia?

Posible duplicado:
captura excepción por puntero en C ++

Siempre capturo excepciones por valor. p.ej

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

Pero encontré un código que en su lugar tenía catch(CustomException &e) lugar. ¿Es esto a) bien b) mal c) un área gris?

La práctica estándar para excepciones en C ++ es …

Lanzar por valor, captura por referencia

La captura por valor es problemática frente a las jerarquías de herencia. Supongamos, para su ejemplo, que existe otro tipo, MyException que hereda de CustomException y anula elementos como un código de error. Si se MyException un tipo MyException su bloque de captura provocaría que se convirtiera en una instancia de CustomException que provocaría el cambio del código de error.

La captura por valor cortará el objeto de excepción si la excepción es de un tipo derivado al tipo que captura.

Esto puede o no ser importante para la lógica en tu bloque catch, pero hay pocas razones para no atrapar por referencia.

Tenga en cuenta que si throw; sin un parámetro en un bloque catch, la excepción original se vuelve a lanzar ya sea que hayas capturado o no una copia cortada o una referencia al objeto de excepción.

A menos que quiera jugar con la excepción, normalmente debería usar una referencia constante: catch (const CustomException& e) { ... } . El comstackdor se ocupa de la vida útil del objeto arrojado.

en (CustomException e) se crea el nuevo objeto de CustomException … por lo que se llamará al constructor mientras está en (CustomException & e) solo la referencia … no se creará ningún objeto nuevo y no se llamará a ningún constructor … tan formal está un poco sobrecargado … después es mejor usar …