Curso C++

[Home]  [Inicio]  [Índice]


Opciones Borland C++ para manejo de excepciones

§1  Sinopsis

El compilador Borland C++ 5.5 permite controlar excepciones asíncronas (lanzadas por el Sistema Operativo), que incluyen situaciones como intentos de accesos ilegales (a zonas de memoria no controladas por la aplicación); errores matemáticos con enteros o con números de punto flotante; desbordamiento de la pila, e interrupciones de teclado Ctrl+C.

Estas excepciones son manejadas en la librería C++ RTL ( 5), y convertidas a objetos de las clases VCL antes de ser devueltas a la aplicación, donde deben ser capturadas siempre por referencia. Las clases VCL utilizadas por este compilador son las mismas que para Delphi, y solo están disponibles para aplicaciones Borland C++ que las utilicen.

El código resultante no es C++ Estándar, y tendría el siguiente aspecto:

try {       // bloque intento
  char* p = 0;
  *p = 0;   // intento de acceso ilegal (posible excepción del Sistema)
}
catch (const EAccessViolation &e) {  // captura de e por referencia
  cout << "No se puede asignar al objeto señalado por un puntero nulo";
}


Algunas de las características del sistema de excepciones de este compilador C++ son las siguientes:

  • El usuario no tiene que preocuparse de destruir el objeto lanzado en la excepción.

  • Las excepciones lanzadas por el Sistema Operativo deben ser capturadas por referencia.

  • Las excepciones lanzadas por el Sistema Operativo deben ser capturadas por los mecanismos correspondientes VCL.

  • No está permitido relanzar una excepción recibida del sistema una vez que se ha salido del bloque catch.

Las tres últimas condiciones pueden ser también enunciadas así: una vez capturada una excepción del Sistema como una excepción C++, no puede ser relanzada como si fuese una excepción VCL o del sistema, a menos que se esté en el mismo marco de la pila.


Las excepciones Win32 son lanzadas con una llamada a la función RaiseException() cuyo prototipo es el siguiente:

void RaiseException(DWORD ec, DWORD ef, DWORD na, const DWORD* a);

  ec  código de la excepción

  ef  etiqueta de excepción. Su valor puede ser 0 o la constante EXCEPTION_NONCONTINUABLE. En caso que la excepción sea no-continuable y se intente continuarla, se invoca raise(EXCEPTION_NONCONTINUABLE_EXCEPTION) ( 1.5.1).

  na número de elementos de la matriz utilizada como argumento.

  a  puntero al primer elemento de la matriz utilizada como argumento. El significado de sus miembros es dependiente de la excepción lanzada en cada caso.