Compartir a través de


Especificaciones de excepciones

Las especificaciones de excepción son características del lenguaje en cuestión. que está desusado en C++0x.Se diseñaron para proporcionar información de resumen sobre qué excepciones se pueden iniciar desde una función, pero se encontraron en la práctica para ser problemáticas.La especificación de excepciones que mostraba ser alguna era la especificación throw ().Por ejemplo:

void MyFunction(int i) throw();

indica al compilador que la función no produce ninguna excepción.Es el equivalente a la __declspec (nothrow).Su uso se considera opcional.En C++0x, muestran el operador de noexcept , pero la compatibilidad para esta característica no todavía está presente en Visual C++ a partir de Visual Studio 2012.

Visual C++ deja el estándar ANSI en su implementación de las especificaciones de excepciones.La tabla siguiente se resume la implementación de Visual C++ de las especificaciones de excepciones:

Especificación de excepciones

Significado

throw ()

La función no producirá una excepción.Sin embargo, si se produce una excepción de una captura función marcada (), el compilador de Visual C++ no llamará inesperado (vea unexpected (CRT) y unexpected (<exception>) para obtener más información).Si una función se marca con la captura (), el compilador de Visual C++ supondrá que la función no produce excepciones de C++ y no genera código en consecuencia.Debido a las optimizaciones codificadas que se pueden realizar en el compilador de C++ (basado en la suposición de que la función no produce ninguna excepción de C++) si una función produce una excepción, el programa puede no ejecutarse correctamente.

captura (...)

La función puede producir una excepción.

throw (type)

La función puede producir una excepción de typeescrito.Sin embargo, en Visual C++ .NET, esto se interpreta como captura (...).Vea Especificadores de excepción de la función.

Si el control de excepciones se utiliza en una aplicación, debe haber una o más funciones que controlan excepciones producidas.Cualquier función llamada entre la que produce una excepción y la que controla la excepción debe ser capaz de producir la excepción.

El comportamiento de captura de una función depende de los factores siguientes:

  • Si está compilando la función bajo C o C++.

  • La opción del compilador de /EH utiliza.

  • Si se especifica explícitamente la especificación de la excepción.

Las especificaciones explícitas de la excepción no se permiten en las funciones c.

La tabla siguiente se resume el comportamiento de captura de una función:

Función

/EHsc

/EHs

/EHa

/EHac

Función de C

throw ()

captura (...)

captura (...)

captura (...)

Función de C++ sin la especificación de excepciones

captura (...)

captura (...)

captura (...)

captura (...)

Función de C++ con la especificación de excepciones throw ()

throw ()

throw ()

captura (...)

captura (...)

Función de C++ con la especificación de excepciones throw (...)

captura (...)

captura (...)

captura (...)

captura (...)

Función de C++ con la especificación de excepciones throw (type)

captura (...)

captura (...)

captura (...)

captura (...)

Ejemplo

// exception_specification.cpp
// compile with: /EHs
#include <stdio.h>

void handler() {
   printf_s("in handler\n");
}

void f1(void) throw(int) {
   printf_s("About to throw 1\n");
   if (1)
      throw 1;
}

void f5(void) throw() {
   try {
      f1();
   }
   catch(...) {
      handler();
    }
}

// invalid, doesn't handle the int exception thrown from f1()
// void f3(void) throw() {
//   f1();
// }

void __declspec(nothrow) f2(void) {
   try {
      f1();
   }
   catch(int) {
      handler();
    }
}

// only valid if compiled without /EHc 
// /EHc means assume extern "C" functions don't throw exceptions
extern "C" void f4(void);
void f4(void) {
   f1();
}

int main() {
   f2();

   try {
      f4();
   }
   catch(...) {
      printf_s("Caught exception from f4\n");
   }
   f5();
}
  

Vea también

Referencia

try, catch, e instrucciones throw (C++)

Control de excepciones de C++