retorno - C++ catch blocks: captura la excepción por valor o referencia?
valores de retorno en lenguaje c (4)
A menos que quiera jugar con la excepción, normalmente debería usar una referencia constante: catch (const CustomException& e) { ... }
. El compilador se ocupa de la vida útil del objeto arrojado.
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 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.
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.
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 ...