En C++, intento capturar todos los tipos de excepciones en una sola captura (como catch(Exception)
en C#). ¿Cómo se hace? Y lo que es más, ¿cómo se pueden ver las excepciones de división por cero?¿Cómo puedo detectar todos los tipos de excepciones en un bloque catch?
Respuesta
catch (...)
{
// Handle exceptions not covered.
}
consideraciones importantes:
- Un mejor enfoque es atrapar tipos específicos de excepción de que en realidad se puede recuperar de oposición a todas las excepciones posibles.
- catch (...) también detectará ciertas excepciones serias del sistema (varía según el compilador) de las que no podrá recuperar de manera confiable. Atraparlos de esta manera y luego tragarlos y continuarlos puede causar problemas más serios en su programa.
- Dependiendo de su contexto, puede ser aceptable usar catch (...), siempre que se vuelva a lanzar la excepción. En este caso, registra toda la información de estado local útil y luego vuelve a lanzar la excepción para permitir que se propague. Sin embargo, debe leer en el RAII pattern si elige esta ruta.
Haga que todas sus clases de excepciones personalizadas hereden de std :: exception, entonces simplemente puede capturar std :: exception. Aquí es un 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!";
}
};
esta es una buena práctica para reducir pegotes de bloques catch Como otros han notado, catch (...) generalmente no es seguro. Std :: exception es un poco desordenado cuando se compila bajo Unicode. (Porque what() devuelve una cadena char, no una cadena wchar_t) – seand
Si no recuerdo mal (que ha pasado 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 de Google (http://www.oreillynet.com/pub/a/network/2003/05/05/cpluspocketref.html) parece demostrar que estoy en lo correcto.
potencialmente inseguro en Windows y probablemente Otros. Atrapa violaciones de acceso y otras ocurrencias realmente malas. – seand
En C++, el estándar no define una excepción de división por cero, y las implementaciones tienden a no lanzarlas.
no desea querer estar usando catch (...) (es decir, atrapar con la elipsis) a menos que realmente, definitivamente, más probables lo necesiten.
La razón de esto es que algunos compiladores (Visual C++ 6 por nombrar los más comunes) también convierten errores como fallas de segmentación y otras condiciones realmente malas en excepciones que puede manejar utilizando catch (...). Esto es muy malo, porque ya no ves los accidentes.
Y, técnicamente, sí, también puedes tomar la división por cero (para eso tendrás que usar "StackOverflow"), pero realmente deberías evitar hacer esas divisiones desde el principio.
lugar, haga lo siguiente:
- Si en realidad se sabe qué tipo de excepción (s) esperar, atrapar a los tipos y nada más, y
- Si necesita lanzar excepciones a sí mismo, y Necesita capturar todas las excepciones que arrojará, haga que estas excepciones se deriven de std :: exception (como sugirió Adam Pierce) y capte eso.
Si necesita todas las excepciones, incluidas las del sistema operativo, es realmente lo que necesita, debe echar un vistazo a su compilador y sistema operativo. Por ejemplo, en Windows probablemente tengas la palabra clave "__try" o el interruptor del compilador para hacer que "try/catch" capture excepciones SEH, o ambas.
ebel gil: ¡gracias, tu respuesta ayudó mucho! – gil
Puede, por supuesto, usar catch (...) { /* code here */ }
, pero realmente depende de lo que quiere hacer. En C++ tienes destructores deterministas (ninguno de esos residuos de finalización), así que si quieres limpiar, lo correcto es usar 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 se utiliza impulso.
Si está en Windows y necesita manejar errores como dividir por cero y violar el acceso, puede usar un traductor de excepción estructurado. Y luego dentro de su traductor puede lanzar una excepción 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 fue el error. También necesita compilar con la opción/EHa (C/C++ -> Generatrión de código -> Habilitar excepciones C/C++ = Sí con excepciones SEH).
Si eso no hace que la caja sentido la documentación para [_set_se_translator] (http://msdn.microsoft.com/en-us/library/5z4bw5h5(VS.80).aspx)
- 1. Múltiples tipos diferentes de manejo de excepciones en un bloque catch?
- 2. ¿Cómo puedo detectar una ThreadAbortException en un bloque finally? (.NET)
- 3. ¿Cómo puedo determinar la excepción actual en un bloque catch (...)?
- 4. ¿Dónde puedo detectar Excepciones en MVVM?
- 5. esperan en bloque catch
- 6. Obteniendo la traza inversa del bloque catch
- 7. Varios bloques try-catch CONTRA un bloque try-catch grande [en un hilo]
- 8. ¿Puedo evitar tal intento engorroso ... bloque catch
- 9. Cómo detectar excepciones en FutureTask
- 10. jQuery: catch ajax excepciones
- 11. Lanzar excepciones en un PHP Try Catch block
- 12. Controlador de excepciones Catch-all en Grails
- 13. excepciones Try-Catch asíncronas
- 14. ¿Cómo puedo detectar excepciones de hilos AWT en Java?
- 15. Utilice un bloque 'try-finally' sin un bloque 'catch'
- 16. ¿Cómo podría diferenciar entre los diferentes tipos de excepciones?
- 17. Código completo en el bloque try/catch
- 18. Práctica recomendada para manejar excepciones, que se lanzan dentro del bloque catch, en un hilo. (.NET)
- 19. Cómo detectar excepciones
- 20. cómo detectar excepciones y continuar el procesamiento en Java
- 21. Excepción no quedar atrapado en el bloque catch
- 22. jQuery bloque UI excepciones
- 23. ¿Cómo obtengo una variable de un bloque try/catch?
- 24. ¿Debería detectar todas las excepciones?
- 25. ¿Cómo detectar de manera confiable los tipos de archivos?
- 26. bloque catch error no requerían
- 27. Obteniendo información sobre dónde se lanzan las excepciones C++ dentro del bloque de catch?
- 28. cómo detectar todos los errores en cualquier acción de scalatra?
- 29. JavaScript try/catch: ¿errores o excepciones?
- 30. Detectar excepción en el bloque finally
puedo conseguir para detectar errores de MySQL (una llave duplicada) ... –