2009-06-11 9 views
11

En C++ throw; cuando se ejecuta dentro de un bloque catch vuelve a lanzar la excepción actualmente capturada fuera del bloque.¿Qué sucede si un tiro? declaración se ejecuta fuera del bloque de captura?

En this answer una idea del despachador excepción se crió como una solución para reducir la duplicación de código cuando se utiliza el control de excepciones complejo menudo:

try { 
    CodeThatMightThrow(); 
} catch(...) { 
    ExceptionHandler(); 
} 

void ExceptionHandler() 
{ 
    try { 
     throw; 
    } catch(FileException* e) { 
     //do handling with some complex logic 
     delete e; 
    } catch(GenericException* e) { 
     //do handling with other complex logic 
     delete e; 
    } 
} 

Lanzar un puntero o un valor no hace ninguna diferencia lo que está fuera de la pregunta.

¿Qué ocurre si se llama a ExceptionHandler() no desde un bloque catch?

yo probamos este código con VC7:

int main(int, char**) 
{ 
    try { 
     throw; 
    } catch(...) { 
     MessageBox(0, "", "", 0); 
    } 
    return 0; 
} 

En primer lugar, hace que el depurador para indicar una excepción de primera oportunidad, entonces inmediatamente una excepción no controlada. Si ejecuto este código fuera del depurador, el programa se bloquea de la misma manera que si se llama a abort().

¿Cuál es el comportamiento esperado para tales situaciones?

+0

Se eliminó la etiqueta "windows" porque esto no tiene nada que ver con Windows (pero ES una buena pregunta). –

Respuesta

23

Desde el estándar, 15,1/8

Si actualmente está siendo manejado no es una excepción, la ejecución de un saque de banda expresión sin operandos llama std::terminate().

+0

Solo porque a) me la ganaste, yb) citó el estándar Eliminaré mi (casi) respuesta duplicada – Glen

Cuestiones relacionadas