tipo - ¿Cómo atrapar la excepción de división por cero entera en el lenguaje C?
tipo de excepciones en c++ (2)
Se sabe cómo atrapar la excepción de flotación por cero con el uso de
signal(SIGFPE, handler)
pero no detecta problema de división por cero entero incluso si configuro la palabra de control con
_control87(0, _MCW_EM ); (MS VC 2010)
SubQuestion_1: ¿Cómo atrapar enteros división por cero en el programa C en Windows sin el uso de SEH EXCEPTION_INT_DIVIDE_BY_ZERO? (En Unix / Linux esto se puede hacer con el uso de la señal estándar / SIGFPE techinque)
EDITAR: la señal es el enfoque de manejo de señales ANSI C.
_control87 es la función estándar de Windows para establecer la palabra de control flotante.
Pregunta similar: cómo manejar todos los errores, incluidos los errores internos de la biblioteca C, uniformemente
NOTA (de ISO / IEC 9899: TC2 Anexo H.2.2):
"Los tipos enteros con signo C int, long int, long long int y los tipos sin signo correspondientes son compatibles con LIA-1. ... Los tipos de entero sin signo de C son '''' módulo '''' en el sentido LIA-1 en que los desbordamientos o los resultados fuera de límites se envuelven silenciosamente. Una implementación que define los tipos enteros con signo como también módulo no necesita detectar el desbordamiento de enteros, en cuyo caso, solo se debe detectar un entero dividido por cero " .
?SOLUCIÓN FINAL:
Para Windows: arroja la excepción SEH. Por lo tanto, se puede capturar mediante el uso de __try __except. Como posible solución, la traducción SEH se podría usar para manejar la excepción SEH y traducirlas a la llamada de la función necesaria. No es una forma "natural", pero parece que es la única forma.
Para Unix: podría capturarse con la solución de señal / SIGFPE. O consulte la wiki para la solución FPE_INTDIV ( http://rosettacode.org/wiki/Detect_division_by_zero#C ).
Como GMan tenía razón sobre el "comportamiento indefinido", estoy eligiendo su respuesta como correcta.
Nota: es interesante comprobar VC / crt / src / winxfltr.c: _XcptActTab matriz:)
¿Comprueba contra qué te estás dividiendo ...?
// if below = 0 then do not divide, just put answer as zero
if (below == 0) {
result = 0;
} else {
result = above/below;
}
La división por cero conduce a un comportamiento indefinido, no existe una construcción del lenguaje C que pueda hacer algo al respecto. Su mejor apuesta es no dividir por cero en primer lugar, al verificar el denominador.
Si desea "capturar" (tenga en cuenta que C no tiene excepciones) este error, dependerá de su compilador y sistema operativo, que no ha enumerado. Por cierto, _control87
solo tiene que ver con operaciones de punto flotante y nada que ver con operaciones enteras.