Indican al programador que excepciones serán lanzados desde esa función. Tienen la ventaja de que tienes la garantía de que no se pueden lanzar otras excepciones desde esa función. Sin embargo, no hay comprobación en tiempo de compilación de si la función realmente arroja alguna excepción que no sea la indicada en el especificador de tiro. En cambio, se verifica en tiempo de ejecución. Y si falla, se llama a unexpected()
, que de manera predeterminada llama al abort()
, que a su vez finaliza su programa. Entonces, a menos que realmente desee que su programa muera si lo arruina y se produce una excepción inesperada, probablemente sea una mala idea usarlos.
El único lugar donde realmente recomendaría su uso es en destructores. Es realmente malo si se lanza un destructor. Deberían nunca tiro.Por lo tanto, si usa throw()
en un destructor para indicar que no puede lanzar una excepción, entonces sabrá que su programa morirá en lugar de continuar en el mal estado en que estaría después de que se haya lanzado una excepción desde un destructor.
Independientemente de eso, si utiliza cualquier tipo de especificador de tiro, debe asegurarse de que realmente desea que su programa muera si se infringe. Entonces, en términos generales, es mejor no usarlos.
El artículo definitivo sobre especificaciones de excepción: http://www.gotw.ca/publications/mill22.htm "Moral # 1: Nunca escriba una especificación de excepción. Moral # 2: Excepto posiblemente uno vacío, pero si yo fuera usted, yo evitaría incluso eso ". –
http://www.gotw.ca/publications/mill22.htm –
Mensaje del futuro: si alguien está leyendo esto hoy, uno debe saber que 'noexcept' puede mejorar el rendimiento del programa (en C++ 11) –