Pregunta

En Visual C++ 2008, quiero "atrapar" una excepción generada, como se muestra aquí:

try {
    int foo = 20;
    ::fgetpos(0, (fpos_t*)&foo);
}
//...

Aquí están los ajustes que he hecho para intentar un éxito de captura:

  1. SEH es activado (/eha)
  2. He añadido un catch(...)
  3. He añadido un _set_se_translator vector.
  4. He añadido/ajustado a la SEH sintaxis:__try / __excepto(EXCEPTION_EXECUTE_HANDLER)

En definitiva, he intentado "todo en el libro" y todavía no puedo capturar la excepción.Si puedo sustituir la llamada a ::fgetpos con int hey = foo / 0 entonces, de repente, todas las técnicas anteriores funcionan como se esperaba.Por lo que la excepción que estoy tratando de ::fgetpos es de alguna manera "extra especial".

Alguien puede explicar por qué este ::fgetpos error parece uncatchable, y cómo evitarlo?

actualización Cuando se ejecuta en el IDE de VS, la ventana de salida no del nombre de una excepción.Todo lo que dice es esto:

Microsoft Visual Studio C Runtime Library ha detectado un error grave en MyProgram.exe.

No es muy útil.Cuando ejecuto la consola de la aplicación desde la línea de comandos, me sale un accidente de diálogo.El "problema" detalles de la sección del diálogo incluye esta información:

Problema Nombre Del Evento:BEX
Excepción Offset:0002fd30
Código De Excepción:c0000417
Datos De Excepción:00000000
Información adicional 1:69ad
Información adicional 2:69addfb19767b2221c8e3e7a5cd2f4ae
Información adicional 3:b1ff
Información adicional 4:b1ffca30cadddc78c19f19b6d150997f

¿Fue útil?

Solución

Ya que el código en su volcado corresponde a STATUS_INVALID_CRUNTIME_PARAMETER, trate de _set_invalid_parameter_handler

Otros consejos

Lo más probable, el tiempo de ejecución de las capturas para usted y los problemas de depuración de diálogo sin devolver o para la propagación de la excepción - que es un CRT llamada y se puede añadir lo que captura la excepción de código no les gusta.Es así que dentro de Visual Studio de los derechos de la captura de un hardware de excepción dentro de una función de biblioteca, especialmente si está ejecutando dentro del IDE o en modo de depuración, entonces es espera en tiempo de ejecución.

Por supuesto, cuando se divide por cero, entonces no hay ninguna llamada de la biblioteca aquí para escribir ese extra de captura de código.

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