Compartir a través de


Diferencias de control de excepciones

La diferencia principal entre el control estructurado de excepciones y el control de excepciones de C++ es que el modelo de control de excepciones de C++ trata en tipos, mientras que los encarga del modelo de control de excepciones estructurado c con excepciones de una escriben — específicamente, unsigned int.Es decir, las excepciones de C se identifican mediante un valor de entero sin signo, mientras que las excepciones de C++ se identifican mediante el tipo de datos.Cuando se genera una excepción en C, cada controlador posible ejecuta un filtro que examine el contexto de la excepción de C y determinar si aceptar la excepción, la pasa a algún otro controlador, o la omisión.Cuando se produce una excepción en C++, puede ser de cualquier tipo.

Una segunda diferencia es que el modelo de control de excepciones estructurado de C se denominan “asincrónico” en que las excepciones se producen secundario al flujo de control normal.El control de excepciones de C++ el mecanismo es totalmente “sincrónica”, lo que significa que se produzcan excepciones cuando se producen.

Si la excepción de C/C++. se produce en un programa de C++., puede ser controlada por un controlador de excepciones estructurado con su filtro asociada o por el controlador de C++. Catch , lo que sea dinámicamente más próximo al contexto de la excepción.Por ejemplo, el siguiente programa de C++ provoca la excepción de C. en el contexto de C++. intento :

Ejemplo

// exceptions_Exception_Handling_Differences.cpp
// compile with: /EHa
#include <iostream>

using namespace std;
void SEHFunc( void );

int main() {
   try {
      SEHFunc();
   }
   catch( ... ) {
      cout << "Caught a C exception."<< endl;
   }
}

void SEHFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
   }
   __finally {
      cout << "In finally." << endl;
   }
}
  
  

Por ejemplo, el código siguiente instala una función personalizada de traducción, y después provoca la excepción de C/C++. que es ajustada por la clase de SE_Exception :

// exceptions_Exception_Handling_Differences3.cpp
// compile with: /EHa
#include <stdio.h>
#include <eh.h>
#include <windows.h>

class SE_Exception {
private:
   SE_Exception() {}
   unsigned int nSE;

public:
   SE_Exception( SE_Exception& e) : nSE(e.nSE) {}
   SE_Exception(unsigned int n) : nSE(n) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() { return nSE; }
};

void SEFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
    }
    __finally {
      printf_s( "In finally\n" );
   }
}

void trans_func( unsigned int u, _EXCEPTION_POINTERS* pExp ) {
   printf_s( "In trans_func.\n" );
   throw SE_Exception( u );
}

int main() {
   _set_se_translator( trans_func );
    try {
      SEFunc();
    }
    catch( SE_Exception e ) {
      printf_s( "Caught a __try exception with SE_Exception.\n" );
      printf_s( "nSE = 0x%x\n", e.getSeNumber() );
    }
}
  
  
  

Clase contenedora de la excepción de C

En un ejemplo simple o error de anterior, la excepción de C solamente se puede detectar por un controlador de Catch de puntos suspensivos ().No se comunica ninguna información sobre el tipo o la naturaleza de la excepción al controlador.Mientras se trabaja este método, puede ser necesario en algunos casos definir una transformación entre los dos modelos de control de excepciones para que cada excepción de C está asociado con una clase concreta.Para ello, puede definir la clase “contenedor” de la excepción de C/C++., que puede ser utilizada o derivada en el atributo una clase concreta escrita a la excepción de C/C++.Al hacerlo, cada excepción de C se puede controlar por el controlador de C++. Catch más por separado que en el ejemplo anterior.

La clase contenedora puede tener una interfaz que se compone de algunas funciones miembro que determinan el valor de la excepción, y el acceso a la información de contexto extendida de excepción proporcionada por el modelo de excepción de C.Puede que también desee definir un constructor predeterminado y un constructor que acepta un argumento de unsigned int (prever la representación subyacente de la excepción de C), y un constructor bit a bit de copia.A continuación se muestra una posible implementación de la clase contenedora de la excepción de C++:.

// exceptions_Exception_Handling_Differences2.cpp
// compile with: /c
class SE_Exception {
private:
   SE_Exception() {}
   SE_Exception( SE_Exception& ) {}
   unsigned int nSE;
public:
   SE_Exception( unsigned int n ) : nSE( n ) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() {
      return nSE;
   }
};

Para utilizar esta clase, instala una función personalizada de la traducción de la excepción de C denominada por la excepción interna de C/C++. el mecanismo de control de excepciones se produce cada vez.Dentro de la función de traducción, puede producir cualquier excepción tipo (quizás tipo de SE_Exception , o un tipo de clase derivada de SE_Exception) que se puede detectar mediante un controlador coincidente adecuado de C++ Catch .La función de traducción simplemente puede volver, que indica que no controló la excepción.Si la propia función de traducción provoca la excepción de C/C++., se llama a finalice .

Para especificar una función personalizada de traducción, llame a la función de _set_se_translator con el nombre de la función de traducción como su argumento único.La función de traducción que se escribe llama una vez para cada invocación de función en la pila que tiene bloques de intento .No hay ninguna función predeterminada de traducción; si no especifica uno llamando a _set_se_translator, la excepción de C se puede capturar únicamente por un controlador de Catch de puntos suspensivos.

Vea también

Referencia

Mezclar C (Structured) y C++ Excepciones