2009-09-11 11 views
13

Empecé a usar excepciones de C++ de manera uniforme, y ahora me gustaría que el compilador (g ++) verifique que no haya "fugas de excepción". La decoración throw debería hacer esto, como hace const para constness de métodos de clase.¿Hay algún uso para la decoración de tiro de C++?

Bueno, no es así.

El uso de throw sigue siendo documental, pero incluso puede ser peligrosamente engañoso si otros piensan que una función no puede arrojar otras excepciones que las enumeradas en su documentación.

Se puede persuadir a g ++ para que sea más estricto en su comprobación de tiro, es decir, realmente asegurándose de que una función decorada como throw() nunca arrojará nada.

Editar: Encontrado this question manejando el tema ampliamente.

+0

pregunta similar aquí: http://stackoverflow.com/questions/1037575/why-arent-exceptions-in-c-checked-by-the-compiler – Glen

Respuesta

15

No comprueba el tiempo de compilación, pero un compilador conforme debe garantizarlo en tiempo de ejecución.

Si una función arroja algo fuera de su declaración de lanzamiento, el tiempo de ejecución C++ debería llamar a std :: unexpected, si no recuerdo mal.

+0

de que es mi entendiendo también Por qué querrías que hiciera así que no tengo idea. Personalmente encuentro 'GetFoo() // throws (std :: runtime_error)' mucho más útil que el equivalente no comentado, solo como una sugerencia para los consumidores de mi código. –

+1

Correcto. El problema práctico para la verificación en tiempo de compilación es que la mayoría del código C++ existente no tiene especificación de lanzamiento. – MSalters

+8

Visual C++ 2008 no es compatible con esta parte de la norma. –

0

No sé si el verificador/compilador puede hacer eso. Tal vez sea más fácil comentarlo en la declaración de la función. Bueno, no es a prueba de tontos, pero si la gente ve que puede haber una excepción lanzada, la mayoría de las personas envolverá la llamada de función en intentar y atrapar.

//Can throw Exception 
GetFoo(); 
2

Básicamente, las especificaciones de excepción solo son buenas como especificación de excepción vacía. De lo contrario, creo que son un experimento que falló. Ver phlipsy's answer por qué.

8

También recomendaría ver el ensayo this sobre las especificaciones de excepción. Se señalan los problemas de este C++ función como:

  • Es un sistema de tipo de sombra
  • El compilador comprueba producen excepciones solamente en tiempo de ejecución
  • El comportamiento por defecto provocado en el caso de una excepción lanzada, pero no se especifica por lo general es inservible y, a menudo mal entendido por los programadores
Cuestiones relacionadas