Pregunta

No se llama al siguiente catch ():

void test(void)
{
    int i=1,j=0,k;
    try
    {
        k = i/j;
    }
    catch(...)
    {
        ...handle it...
    }
}

¿Hay alguna forma de detectar este tipo de excepción?

¿Fue útil?

Solución

Por favor, compruebe http://linux.die.net/man/1/gcc hay una opción de compilador -mcheck-zero-division para manejar esto.

Alternativamente, la instalación de un controlador SIGFPE podría ser una opción,  Un float div por 0 generaría un 'FPE_ZERODIVIDE'

         signal(SIGFPE, (fptr) FPE_ExceptionHandler);

         void FPE_ExceptionHandler(int nSig,int nErrType,int */*pnReglist*/)
          {
                switch(nErrType)
                  {
                    case FPE_ZERODIVIDE:  /* ??? */ break;
                }

            }

desde

La mayoría de los sistemas de punto flotante se basan en el estándar IEEE, que permite la división por 0. Esto devuelve el infinito positivo o el infinito negativo según sea apropiado en función de los signos de los números. (Excepto 0/0 devuelve la NAN no definida, lo que no es un caso excepcional). Esto suele ser útil para aplicaciones científicas y matemáticas. Las NAN señalan de manera efectiva un caso en el que los cálculos no eran psicoactivos, pero permiten que los cálculos continúen. Los cálculos continuados no producirán nuevos resultados, pero continuarán devolviendo las NAN. Esto permite que se realicen largas cadenas de cálculos sin verificación de errores dentro del cálculo. Las comprobaciones de errores solo deben realizarse al final del trabajo. Esto hace que el código sea mucho más simple y más rápido. También puede ser más útil a veces, ya que para algunas aplicaciones, la infinidad es un " útil " resultado, no es realmente una señal de problemas.

Otros consejos

No: no se lanza ninguna excepción (se recibe una señal, probablemente SIGFPE). Debe verificar la posible división por ceros en su código y luego lanzar una excepción usted mismo,

Si esto causa un error de tiempo de ejecución (consulte agradable discusión de lakshmanaraj sobre IEEE maths , aunque algunos compiladores te permitirán forzar errores en lugar de NaNs), arroja una excepción de punto flotante señal .

Las señales son un mecanismo diferente a las excepciones de c ++ y se manejan a nivel de SO. Ya hay una serie de preguntas de SO relacionadas con el mecanismo de señal * nix, que incluyen:

Para Windows, tendrás que preguntarle a alguien más. Mac OS X es, por supuesto, un sistema derivado de Unix.

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