2011-01-01 12 views
20

¿Podría dar una lista de viñetas de diferencias prácticas/implicación? Leí un artículo relevante de MSDN, pero mi comprensión de las excepciones asincrónicas todavía es un poco confusa.EHsc vc EHa (manejo de excepciones síncronas vs asíncronas)

Estoy escribiendo un conjunto de pruebas utilizando Boost.Test y mi compilador emite una advertencia de que EHa debe estar activada:

advertencia C4535: llamar _set_se_translator() requiere/EHa

El proyecto en sí usa solo excepciones simples (de STL) y no necesita/interruptor EHa. ¿Debo recompilarlo con el modificador/EHa para que el banco de pruebas funcione correctamente? Mi sensación es que necesito/EHa solo para el traje de prueba.

Respuesta

30

Cuando usa/EHsc, el compilador solo emitirá código para filtros de excepción cuando puede detectar que el código envuelto en el bloque try {} podría lanzar una excepción C++. Un filtro de excepción asegura que el destructor de cualquier objeto local de C++ se llame cuando la pila se desenrolla mientras se maneja una excepción. Hace que RAII funcione.

Eso es una optimización, espacio y tiempo para el código x86, espacio para el código x64. Espacio porque puede omitir el código de filtro de excepción, que es modesto por cierto. Tiempo porque en x86 puede evitar registrar el filtro de excepción al ingresar al bloque try {}. Muy modesto por cierto. x64 usa una forma diferente de encontrar filtros de excepción, está basado en tablas.

La frase clave en el primer párrafo es "podría arrojar una excepción de C++". En Windows existen otras fuentes de excepciones. Al igual que la "a" en/EHa, excepciones asincrónicas que plantea el hardware. Cosas como excepciones de punto flotante, división por cero y la excepción de violación de acceso omnipotente. Pero también notablemente el tipo de excepciones que surgen por código con el que puede interoperar. Al igual que el código administrado, básicamente todo lo que se ejecuta en una máquina virtual.

Cuando desee hacer que sus objetos sean seguros para estas excepciones también necesitará usar/EHa, que le dice al compilador siempre registrar el filtro de excepción.

Tenga cuidado con un desagradable efecto secundario de/EHa, hace que capture (...) trague todas las excepciones. Incluyendo los que nunca debes atrapar, como AV y SO. Mire __try/__except y _set_se_translator() si eso es importante para usted.

+2

+1 Ah, no sabía las diferencias entre x86 y x64. ¿Podría recomendar amablemente alguna referencia sobre la programación x64? Algo así como "10 minutos de introducción a la programación x64 para el programador x86" :) – 9dan

6

Bueno, sin/EHa no puede detectar excepciones inesperadas por lo que su programa de prueba saldrá anormalmente.

Si se puede realizar una prueba de salida anormal, sería mejor no luchar con/EHa.

Además, cambiar la opción a/EHa genera muchos efectos secundarios, incluido un aumento en el tamaño del ejecutable y una baja en el rendimiento. Así que efectivamente cambia el comportamiento original.

Para usar o no usar/EHa es una gran decisión que generalmente se toma en la etapa de diseño del programa.

En mi humilde opinión, los problemas en la escritura de casos de prueba son bastante insignificantes para cambiar esta decisión.