try sirve qué que propagacion para manejo excepciones errores catch c++ c performance exception try-catch

c++ - sirve - try catch java



¿Qué es mejor usar, un bloque__try/__ excepto un bloque try/catch? (5)

C ++ estándar usa bloques try / catch, por lo que recomendaría usarlos, si necesita el mecanismo de excepción "estándar", basado en la biblioteca estándar de C ++.

Sin embargo, si planea usar el manejo estructurado de excepciones proporcionado a través del SDK de Windows (vea here ), use __try / __except .

Me pregunto cuál es la mejor manera de detectar las excepciones que lanzo: ¿es un bloque __try / __except o un bloque try / catch?

Estoy escribiendo en C ++ y el programa solo se usará en Windows, por lo que la portabilidad no es un problema.

¡Gracias!


Son dos cosas muy diferentes. try / catch son las palabras clave conocidas de C ++ que conoces. __try/__except se utiliza para detectar excepciones SEH. Excepciones planteadas por el propio Windows, como DivisionByZero o AccessViolation. Está bien descrito en el artículo de MSDN Library para ello.

También puede usarlo para capturar la excepción de C ++ porque aprovecha la función SEH de Windows. Sin embargo, no puede sacar el objeto de excepción arrojado, por lo que habrá un contexto cero si realmente desea que el control maneje la excepción. Que es la locura. El enfoque número uno es no atrapar las excepciones de SEH, siempre son groseras. Si necesita casar los dos, use _set_se_translator () para convertir la excepción SEH en una excepción de C ++.


Una vez que has lanzado algo, ya no tienes mucha elección sobre cómo atraparlo. Si lanza excepciones de C ++ (es decir, con throw ), use try / catch . Si lanza excepciones de Windows (es decir, con RaiseException ), use __try / __except . Tratar de mezclarlos solo agregará problemas innecesarios a tu vida.


__try/__except está diseñado para llamar al código Win32 C que no admite excepciones pero utiliza un mecanismo de manejo / código de error estructurado. __try/__except traducirá los errores de C en un bloque de excepción similar a C ++ try / catch.

Para más información, vea este artículo de MSDN .


Debes usar un bloque try / catch .

Como otros ya han respondido, __try / __except es para capturar SEH (ventanas generadas errores) no para capturar excepciones generales.

Lo más importante es que __try y __catch pueden no ejecutar los destructores de C ++ o desenrollar correctamente la pila cuando se produce una excepción.

Excepto en casos raros, nunca debe intentar capturar excepciones SEH.

EDIT: Bueno, fui positivo en esto (es lo que siempre me han dicho), pero @Hans dice que aparentemente hay un conmutador de compilador que puede usar para cambiar esto. Creo que los documentos sobre /EHa son engañosos, o al menos incompletos, sobre lo que sucede aquí. Si alguien encuentra documentos definitivos que prueban que esto es incorrecto, eliminaré felizmente esta respuesta.

Incluso si resulta que esto es falso, aún debe usar try and catch simplemente porque son estándar, mientras que __try y __except no lo son.