¿Realmente puedes tener una función / método sin un cuerpo pero solo un bloque try / catch?

StackOverflow https://stackoverflow.com/questions/335839

  •  22-07-2019
  •  | 
  •  

Pregunta

Tenga en cuenta que esta función no tiene un " {" y "} " cuerpo. Solo un bloque try / catch:

void func( void )
try
{
    ...
}
catch(...)
{
    ...
}

¿Es esto intencionalmente parte de C ++ o es una extensión de g ++?

¿Hay algún propósito para esto que no sea omitir 1 nivel de {}?

Nunca había oído hablar de esto hasta que me encontré con http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html

¿Fue útil?

Solución

Sí, es estándar. Los bloques de prueba de funciones, como se los llama, no son de mucha utilidad para las funciones regulares, pero para los constructores, le permiten detectar excepciones lanzadas en la lista de inicializadores.

Tenga en cuenta que, en el caso del constructor, la excepción siempre se volverá a generar al final de cualquier bloque catch.

Otros consejos

Sí, eso es válido C ++. Un propósito que he encontrado para ello es traducir excepciones en valores de retorno, y hacer que el código traduzca las excepciones en valores de retorno por separado del otro código en la función. Sí, puedes return x; desde un bloque catch como el que mostraste (en realidad, recientemente lo descubrí). Pero probablemente usaría otro nivel de llaves y pondría el try / catch dentro de la función en ese caso. Será más familiar para la mayoría de los programadores de C ++.

Otro propósito es detectar excepciones generadas por una lista de inicializador de constructor, que utiliza una sintaxis similar:

struct f {
    g member;
    f() try { 
        // empty
    } catch(...) { 
        std::cerr << "thrown from constructor of g"; 
    }
};

Herb Sutter tiene un buen artículo sobre esto: http://www.gotw.ca/gotw /066.htm .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top