Saltar al contenido

¿Cómo detectar el error de división por cero en Visual Studio 2008 C++?

Traemos la mejor respuesta que hallamos por todo internet. Nosotros esperamos que te resulte de ayuda y si quieres comentarnos algún detalle que nos pueda ayudar a mejorar hazlo con libertad.

Solución:

C ++ no maneja la división por cero como una excepción, per se.

Citando a Stroustrup:

“Se supone que los eventos de bajo nivel, como los desbordamientos aritméticos y la división por cero, son manejados por un mecanismo de nivel inferior dedicado en lugar de por excepciones. Esto permite que C++ coincida con el comportamiento de otros lenguajes cuando se trata de aritmética. También evita los problemas que ocurren en arquitecturas con muchos canales donde eventos como dividir por cero son asincrónicos”.

“El diseño y la evolución de C++” (Addison Wesley, 1994)

En cualquier caso, las excepciones son nunca un reemplazo para el manejo adecuado de condiciones previas.

Para atrapar las excepciones de división por cero en Visual C ++, intente-> atrapar (…) simplemente habilite la opción /EHa en la configuración del proyecto. Ver Propiedades del proyecto -> C/C++ -> Generación de código -> Modificar Habilitar excepciones de C++ a “Sí con excepciones de SEH”. ¡Eso es todo!

Consulte los detalles aquí: http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.80).aspx

Suponiendo que no puede simplemente corregir la causa del código de generación de excepciones (quizás porque no tiene el código fuente de esa biblioteca en particular y quizás porque no puede ajustar los parámetros de entrada antes de que causen un problema).

Tienes que pasar por algunos obstáculos para que esto funcione como te gustaría, pero se puede hacer.

Primero necesita instalar una función de traducción de Manejo estructurado de excepciones llamando _set_se_translator() (ver aquí) luego puede examinar el código que se le pasa cuando ocurre una excepción SEH y lanzar una excepción C++ apropiada.

void CSEHException::Translator::trans_func(
    unsigned int code, 
    EXCEPTION_POINTERS *pPointers)

   switch (code)
   
       case FLT_DIVIDE_BY_ZERO : 
          throw CMyFunkyDivideByZeroException(code, pPointers);
       break;
   

   // general C++ SEH exception for things we don't need to handle separately....
   throw CSEHException(code, pPointers);

Entonces simplemente puede capturar su CMyFunkyDivideByZeroException() en C++ de la manera normal.

Tenga en cuenta que debe instalar su función de traducción de excepciones en cada subproceso en el que desee que se traduzcan las excepciones.

Si piensas que ha resultado provechoso nuestro post, sería de mucha ayuda si lo compartieras con el resto programadores de esta forma contrubuyes a dar difusión a nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *