2010-04-22 22 views
19

Me tropecé este código:qué significa "lanzar"; fuera de un bloque de captura ¿verdad?

void somefunction() 
{ 
    throw; 
} 

y me pregunto: ¿qué significa?


Marqué la pregunta como C++ y Visual C++ porque no sabía la respuesta. La respuesta podría haberse relacionado con el estándar o con una extensión especial de Visual C++ o con Visual C++ ignorando el estándar. Es por eso que pensé que ambas etiquetas están justificadas.

+3

Esta pregunta no está relacionada con Visual Studio ni con ningún tipo de C++ "visual". Por favor, no etiquetes preguntas genéricas de C++ con etiquetas concretas de marcos. –

+0

@Pavel Shved: La pregunta podría estar relacionada con VC++ si hubiera algún tipo de extensión de idioma aplicable.En ese caso, sería deseable responder sobre esa base, al mismo tiempo que señala la respuesta de acuerdo con el Estándar. –

+0

@David, @Tobias, creo que es mejor no etiquetar la pregunta como relacionada con CV si no está seguro. La comunidad lo repetirá apropiadamente si se trata de una extensión de idioma. –

Respuesta

28

Por supuesto, es posible que somefunction() solo se llame desde dentro de un bloque catch (supongo que probablemente sea la intención de todos modos).

Si se ejecuta throw; cuando una excepción no está activa, llama al terminate() (§15.1/8).

9

Re-arroja la excepción actualmente activa. Tendría sentido llamarlo (posiblemente indirectamente) desde un bloque de captura. Esto:

#include <iostream> 
using namespace std; 

void f() { 
    throw; 
} 

int main() { 
    try { 
     try { 
      throw "foo"; 
     } 
     catch(...) { 
      f(); 
     } 
    } 
    catch(const char * s) { 
     cout << s << endl; 
    } 
} 

imprime "foo".

4

Para throw el concepto de bloque de captura "exterior" o "interior" se define en términos de tiempo de ejecución, no en términos de tiempo de compilación, como parece suponer. Por lo tanto, si durante el tiempo de ejecución se ejecuta throw en el contexto de tiempo de ejecución de un bloque catch, entonces throw funciona como se esperaba. De lo contrario, se llama terminate().

De hecho, si observa de cerca cómo se definen las excepciones de C++ en la especificación del lenguaje, muchas cosas sobre ellas se definen en términos de tiempo de ejecución. A veces incluso parece ser un-como C++.

+0

no, yo no asumió tal cosa. Pero no comenté el uso de la función lo suficiente. Perdón por el malentendido. –

3

Las personas ya han explicado lo que significa, pero es potencialmente útil saber por qué podría verlo. Es una forma útil de construir un manejador de excepciones 'genérico' que maneje excepciones basadas en su tipo para reducir la cantidad de código duplicado.

Así, si tomamos Neil's example y ampliar lo que podría estar haciendo f() podríamos terminar con una aplicación que no hace algo así como mi LogKnownException() función que propuse en this answer.

Si está trabajando en un equipo que le gusta registrar todo tipo de excepciones en todo el lugar, en lugar de tener una enorme colección de bloques de captura en todos estos lugares (o incluso una macro) puede tener un simple bloque catch que tiene este aspecto

catch(...) 
{ 
    LogKnownException(); 
} 

Aunque espero que cambiaría mi ejemplo anterior de LogKnownException() a uno que simplemente permitía excepciones que no desea iniciar sesión para propagar y continuar de una manera no controlada.

No estoy sugiriendo que esto sea necesariamente algo bueno que hacer, solo señalando que es aquí donde es probable que vea la construcción utilizada.

Cuestiones relacionadas