2008-09-29 4 views

Respuesta

29

El segundo. Aquí está mi intento de citar Sutter

"Tira por el valor, la captura por referencia"

Aprende a catch correctamente: lanzar excepciones de valor (no puntero) y captura por referencia (por lo general a const) . Esta es la combinación que combina mejor con la semántica de excepción. Al volver a lanzar la misma excepción , prefiera solo throw; a throw e;.

Aquí está la completa Item 73. Throw by value, catch by reference.


La razón para evitar la captura de excepciones por valor es que implícitamente hace una copia de la excepción. Si la excepción es de una subclase, se perderá información al respecto.

try { throw MyException ("error") } 
catch (Exception e) { 
    /* Implies: Exception e (MyException ("error")) */ 
    /* e is an instance of Exception, but not MyException */ 
} 

La captura por referencia evita este problema al no copiar la excepción.

try { throw MyException ("error") } 
catch (Exception& e) { 
    /* Implies: Exception &e = MyException ("error"); */ 
    /* e is an instance of MyException */ 
} 
+0

Qué quiere decir el primero? –

+0

Doug T: No es el segundo. Captura por referencia. –

+0

Un poco más de detalle en la respuesta sería bueno. Deje el enlace para los detalles exactos pero ponga los detalles (y el ejemplo) sobre el método más aceptado. –

3

Definitivamente el segundo. Si usted tuvo la siguiente:

class my_exception : public exception 
{ 
    int my_exception_data; 
}; 

void foo() 
{ 
    throw my_exception; 
} 

void bar() 
{ 
    try 
    { 
    foo(); 
    } 
    catch (exception e) 
    { 
    // e is "sliced off" - you lose the "my_exception-ness" of the exception object 
    } 
} 
+0

Creo que el objetivo de la pregunta era si capturar por referencia o por valor, no si capturar alguna versión de clase base de la excepción. –

+1

El problema del corte es uno de los principales motivos por los que siempre debe tomarse como referencia –

+0

. Ahora veo lo que quiere decir: si se capturara e por referencia en su ejemplo, el polimorfismo se activaría adecuadamente. –

6

Además, tenga en cuenta que, al utilizar MFC, puede que tenga que catch by pointer. De lo contrario, la respuesta de @JaredPar es la forma en que normalmente deberías ir (y afortunadamente nunca tendrás que lidiar con cosas que arrojen un puntero).

11

En lo personal, me gustaría ir por la tercera opción:

catch (const _com_error& e) 
+0

Sí, si es posible, debe ser const. – Miquella