2010-01-13 23 views

Respuesta

12

Sin ningún parámetro, significa que las funciones mencionadas no incluyen arrojan excepciones.

Si especifica algo como parámetro, está diciendo que la función lanzará solo excepciones de ese tipo. Tenga en cuenta, sin embargo, esto es no una aplicación para el compilador. Si se lanza una excepción de algún otro tipo, el programa llamará a std :: terminate().

+0

Tenga en cuenta que no todos los compiladores admiten esta sintaxis. De particular interés, VS2008 no. –

+0

¿En serio? No es una característica particularmente nueva. –

+0

Ese es el manejador de excepciones inesperado predeterminado. Un usuario puede decidir cambiarlo usando std :: set_unexpected(). Sin embargo, eso típicamente no compra mucho a un usuario. Herb Sutter tiene un excelente artículo de GoTW sobre este tema: http://www.gotw.ca/gotw/082.htm – Void

18

Es una "especificación de excepción". throw() significa "esta función no lanzará ninguna excepción". También puede especificar excepciones, por lo que throw (foo) diría que esta función puede arrojar excepciones de tipo foo.

La utilidad de esta característica se ha debatido bastante en la comunidad C++; la evaluación general parece ser que no es particularmente útil. Para más detalles echa un vistazo a this Herb Sutter article.

+0

Gracias por el enlace a ese artículo. – Murali

+0

Me opongo al supuesto significado "esta función no arrojará ninguna excepciones ". Lo que realmente significa es más como" las llamadas a esta función detectarán cualquier excepción que arroje y termine ".Si la gente pensara de esa manera, no tomaría Herb Sutter persuadirlos de que no es muy útil. Y especialmente no pensarían que las especificaciones de tiro vacío son una optimización. –

+0

@Steve Bueno, la mayoría de la gente _realmente_ no quiere que termine() llamado, así que creo que hacen un esfuerzo para que signifique lo que dije. En cuanto a las optimizaciones, nunca me he encontrado con esa idea. –

1

Esto se denomina especificación de tiro. Define qué excepciones (si las hay) pueden arrojarse desde la función.

Suenan muy bien en teoría, pero hay problemas con su uso.

Puede encontrar una buena discusión al respecto en este SO question.

0

Can throw() tomar los parámetros?

Sí se puede usar para declarar qué parámetros está permitido arrojar el método.

También el destructor está marcado como throw(), los destructores nunca deben lanzar excepciones ya que pueden estar ejecutándose en el contexto de una excepción lanzada.

+1

Para aclarar, el destructor declarado es correcto: throw() indica que el destructor NO lanzará una excepción, que es el patrón apropiado. – Dathan

Cuestiones relacionadas