2009-12-25 13 views
6

De vez en cuando hay una gran necesidad de escribir un programa de forma que nunca (realmente nunca) muestre un mensaje de error como un cuadro de mensaje. Por ejemplo, puede ser un programa ejecutado dentro de una compilación diaria; si se cuelga con un cuadro de mensaje, se bloquea la compilación diaria.Lista de cosas para comprobar para evitar que las aplicaciones de VC++ muestren cuadros de mensaje de error fatales

Desafortunadamente, el tiempo de ejecución de VC++ tiene muchas formas de desencadenar cuadros de mensaje cuando se indican errores.

En primer lugar, siempre que no se maneje una excepción, se llama terminate() que llama al abort() lo que causa "Esta aplicación ha solicitado que el Runtime lo termine de una manera inusual". buzon de mensaje. Esto puede solucionarse detectando todas las excepciones y/o utilizando set_terminate() para establecer un controlador personalizado terminate() sin cuadros de mensaje.

Luego, cuando una excepción se escapa de cualquier destrutor durante el desenrollado de la pila terminate() también se llama. set_terminate() ayuda aquí también.

Luego, hay un cuadro de mensaje de "pura llamada de función virtual" que se muestra en algunos casos graves de desajuste entre el número de funciones esperadas por el llamante y las implementadas por el destinatario. _set_purecall_handler() debería ayudar aquí.

¿Qué más hacer a un programa de VC++ para estar completamente seguro de que no muestra un cuadro de mensaje en alguna situación fatal?

+1

las dos cosas que usted describe son errores de programación. Me parece mejor no hacerlas, o al menos hacer que las detecten mediante revisiones de código y demás, en lugar de aplicar una curita. –

+0

@Neil: Sí, claro, pero es totalmente incómodo colgar construcciones diarias. Como si vienes el lunes esperando ver resultados de tres compilaciones diarias, de sábado a lunes, y no veas ninguno. Inicia sesión en el servidor de compilación solo para ver uno de esos cuadros de mensaje. Ver tres informes de fallas con un mensaje conectado en ellos sería mucho mejor. – sharptooth

+0

@Neil: sin mencionar, es posible que desee agregar algún tipo de registro de error o un volcado del rastreo de la pila en el caso de excepciones, en lugar de que sus usuarios obtengan un cuadro de mensaje feo que indica un error que no será capaz de investigar adecuadamente –

Respuesta

2

Recomendaría que utilice un programa auxiliar para iniciarlo y hacer que este helper limite el tiempo que puede ejecutar su programa. Esta es, de lejos, la forma más segura si puede hacerlo, ya que maneja todos los casos. Algunas cosas que no puede manejar en su programa directamente, como "Este programa no es una aplicación Win32 válida", lo que podría suceder si le falta un archivo DLL.

Cuestiones relacionadas