Debe usar un bloque try
/catch
.
Como otros ya han respondido, __try
/__except
es para detectar SEH (errores generados por la ventana) no para capturar excepciones generales.
Lo más importante es que __try
y __catch
no pueden ejecutar destructores C++ o desenrollar correctamente la pila cuando se produce una excepción.
Excepto en casos excepcionales, nunca intente atrapar excepciones de SEH.
EDIT: Bueno, yo era positivo en esto (es lo que siempre me han dicho), pero @Hans dice que aparentemente hay un interruptor de compilador que puede usar para cambiar esto. Creo que los documentos en /EHa
son engañosos, o al menos incompletos, sobre lo que sucede aquí. Si alguien encuentra documentos definitivos que prueban que esto está mal, felizmente eliminaré esta respuesta.
Incluso si resulta que esto es falso, todavía se debe usar try
y catch
simplemente porque son estándar, mientras que __try
y __except
no lo son.
¿Entonces no desenrolla la pila? Eso significa que probablemente sea una mala idea usar '__try' /' __except' como algo más que un sistema de informe de fallos, mientras que es común poder recuperarse de una excepción en un bloque 'try' /' catch'. –
@David: Eso es correcto. '__try' y' __except' son estrictamente una API/ABI basada en C. –
Los únicos buenos usos que he visto han sido lidiar con lo que equivalía a errores en Windows mismo (como lo que solía ocurrir cuando intentabas copiar un dispositivo). Podría decirse que siempre son indicativos de un lugar donde Windows debería haber atrapado la excepción para usted y la tradujo en un error. (La forma en que trabajan también es horrible, y muy específica de x86 ...) –