Pregunta

En C++, estoy tratando de atrapar a todos los tipos de excepciones en una trampa (como catch(Exception) en C#).¿Cómo se hace?Y lo que es más, ¿cómo puede uno coger la división por cero excepciones?

¿Fue útil?

Solución

catch (...)
{
   // Handle exceptions not covered.
}

Consideraciones importantes:

  • Un mejor enfoque es el de atrapar a los tipos específicos de excepción que en realidad se puede recuperar a partir de frente a todas las posibles excepciones.
  • catch(...) también atrapar a ciertos graves a nivel del sistema de excepciones (varía según el compilador) y que no va a ser capaz de recuperar de forma fiable a partir de.La captura de ellos en esta manera y a tragar con ellos y continuando podría causar más problemas serios en su programa.
  • Dependiendo del contexto puede ser aceptable el uso de la captura(...), proporcionando la excepción es re-lanzada.En este caso, registro de todos los útiles, locales la información de estado y, a continuación, volver a lanzar la excepción para permitir que se propaguen hacia arriba.Sin embargo, usted debe leer sobre el RAII patrón si elige esta ruta.

Otros consejos

Usted no quiero ser el uso de la captura (...) (es decir,la captura con el botón de puntos suspensivos) a menos que usted realmente, sin duda, la mayoría de los comprobable tienen necesidad de ello.

La razón de esto es que algunos compiladores de Visual C++ 6 a nombre de los más comunes) también se convierten errores como fallas de segmentación y otras muy malas condiciones en las excepciones que con mucho gusto puede controlar mediante catch (...).Esto es muy malo, porque usted no ve los accidentes más.

Y técnicamente, sí, también se puede coger la división por cero (usted tendrá que "StackOverflow" para eso), pero lo que realmente se debe evitar hacer esas divisiones en el primer lugar.

En lugar de eso, haga lo siguiente:

  • Si realmente sabes qué tipo de excepción(s) de esperar, la captura de esos tipos y no más, y
  • Si usted necesita para lanzar excepciones a sí mismo, y la necesidad de capturar todas las excepciones que se arrojan, hacen de estas excepciones derivan de std::excepción (como Adam Pierce sugerido) y captura.

Si estás en windows y la necesidad de controlar los errores como dividir por cero y de infracción de acceso puede utilizar una excepción estructurada traductor.Y, a continuación, en el interior de su traductor usted puede lanzar una excepción de c++:

void myTranslator(unsigned code, EXCEPTION_POINTERS*)
{
    throw std::exception(<appropriate string here>);
}

_set_se_translator(myTranslator);

Nota, el código le dirá lo que el error fue.También se debe compilar con la opción /EHa (C/C++ -> Código Generatrion -> Habilitar C/C++ Excepciones = Sí, con la SEH Excepciones).

Si que no tiene sentido comprobación de los documentos para [_set_se_translator](http://msdn.microsoft.com/en-us/library/5z4bw5h5(VS.80).aspx)

Si la captura de todas las excepciones, incluido el sistema operativo - que es realmente lo que usted necesita, usted necesita tomar un vistazo a su compilador y el sistema operativo.Por ejemplo, en Windows probablemente tiene "__a tratar de" palabra clave o modificador de compilador para hacer "try/catch" catch SEH excepciones, o ambos.

Hacer tus propias clases de excepciones heredar de std::excepción, entonces usted puede simplemente coger std::excepción.Aquí está el código de ejemplo:

class WidgetError
    : public std::exception
{
public:
    WidgetError()
    { }

    virtual ~WidgetError() throw()
    { }

    virtual const char *what() const throw()
    {
        return "You got you a widget error!";
    }
};

En C++, el estándar no define una división por cero excepción, y las implementaciones tienden a no tirar de ellos.

Usted puede, por supuesto, el uso de catch (...) { /* code here */ }, pero realmente Depende De Lo Que Quieras Hacer.En C++ tiene determinista destructores (ninguno de los que la finalización de la basura), así que si quieres limpiar, lo correcto es utilizar RAII.

Por ejemplo.en lugar de:

void myfunc()
{
    void* h = get_handle_that_must_be_released();
    try { random_func(h); }
    catch (...) { release_object(h); throw; }
    release_object(h);

}

Hacer algo como:

#include<boost/shared_ptr.hpp>

void my_func()
{
    boost::shared_ptr<void> h(get_handle_that_must_be_released(), release_object);
    random_func(h.get());
}

Crear su propia clase con un destructor si no usar el boost.

Si no recuerdo mal (que ha sido un tiempo desde que he mirado en C++), creo que el siguiente debe hacer el truco

try
{
 // some code
}
catch(...)
{
 // catch anything
}

y una rápida en google(http://www.oreillynet.com/pub/a/network/2003/05/05/cpluspocketref.html) parece demostrar que estoy en lo correcto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top