Pregunta

Si estoy creando un nuevo proyecto en C ++ no administrado, Visual Studio 2008 o mayor, que a excepción de manipulación modelo es lo que quiero ir con?

Yo entiendo que / EHA opción produce código sea menos eficiente, y también captura excepciones SEH, ¿verdad?

Así que he estado (...) manipuladores de dirección clara de esa opción y por lo general va con / EHsc, por lo que sólo estoy poniendo excepciones de C ++ que en realidad se tiran y no la captura de violaciónes de acceso y otras execptions estructuradas, en las capturas . Si hay una violación de acceso en mi código, no quiero a un enmascaramiento por un retén (...) {}.

Código de I con otros que quieren captura (...) {} no hacer nada y que incluso lo deseen hacerlo si hay una violación de acceso, que parece una idea muy mala para mí. Si hay un error debido a la mala codificación, que no quiere meter los dedos en los oídos y en voz alta decir "La la la la la!" de modo que usted no tiene que tener la caída del programa? De hecho, si el código está en mal estado a causa de un error de codificación, es lo que realmente desea que el código para continuar?

Así que mi pensamiento general es que / EHa crea código más grande / más lento y que permite a los programadores se salgan con la escritura de código que si un error fatal está presente, continuará funcionando en un estado indefinido.

Por cierto, estoy hablando de aplicaciones y código de servicio que es lo que estamos escribiendo en su mayor parte. No bajo nivel controladores de dispositivo o algo por el estilo.

Por favor, pesan con sus pensamientos.

¿Fue útil?

Solución

/ EHa hace dos cosas. En primer lugar, se suprime una optimización que omite los filtros de excepción que llaman automáticamente a los destructores de las variables de clase locales si el analizador de código no se puede ver ningún código que podría lanzar una excepción de C ++. Esto hace pila de desenrollar seguro para cualquier tipo de excepción, no sólo una excepción ++ C. Gastos generales para estos filtros de excepción es el tiempo en x86 y el espacio tanto en x86 y x64.

Y sí, se altera el comportamiento de la captura (...), ahora también filtra ninguna excepción SEH, no sólo C ++. Este es de hecho una apuesta, ya que captura todas las cosas realmente desagradables, las excepciones de hardware asíncronos. Aunque personalmente no creo que la captura de todas las excepciones de C ++ es muy defendible bien, pero todavía tiene una vaga idea en qué medida el estado del programa consiguió mutado y por qué ha fallado.

Siendo realistas, necesitará pasar a utilizar __try/__except de modo que usted puede escribir su propio filtro de excepción y evitar la captura de los malos. El código de excepción para excepciones de C ++ es 0xe04d5343 ( "MSC"). Usando _set_se_translator () sería otro enfoque.

Otros consejos

utilizo / EHa porque es seguro con .NET de interoperabilidad, mientras / EHsc puede no ser; ver no llamados cuando nativo (C ++) excepción propaga a CLR componente por ejemplo.

Sin embargo, si por un poco de código específica la capacidad que realmente importa y que no necesita .NET (o cualquier otra cosa) compatibilidad, entonces seguro, / EHsc suena bien.

Ni / ni EHsc / EHa captura más errores de memoria, por lo que el uso de estos para violaciónes de acceso de captura es un caso perdido.

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