La generación de una excepción puede ser pura O no pura, solo depende del tipo de excepción que se produzca. Una buena regla empírica es si la excepción es planteada por código, es pura, pero si el hardware la plantea, generalmente debe clasificarse como no pura.
Esto se puede ver mirando lo que ocurre cuando el hardware hace una excepción: Primero se genera una señal de interrupción, luego el manejador de interrupciones comienza a ejecutarse. El problema aquí es que el manejador de interrupciones no era un argumento para su función ni especificado en su función, sino una variable global. Cada vez que se lee o escribe una variable global (también conocida como estado), ya no tiene una función pura.
Compárelo con una excepción que aparece en su código: construye el valor de excepción a partir de un conjunto de argumentos o constantes de ámbito local conocido y "arroja" el resultado. No hay variables globales utilizadas. El proceso de arrojar una excepción es esencialmente azúcar sintáctica proporcionada por su idioma, no introduce ningún comportamiento no determinista o no puro. Como dijo Don, "debe ser semánticamente equivalente a usar un tipo Maybe o Option", lo que significa que también debe tener todas las mismas propiedades, incluida la pureza.
Cuando dije que levantar una excepción de hardware "generalmente" se clasifica como un efecto secundario, no siempre tiene que ser el caso. Por ejemplo, si la computadora en la que se ejecuta su código no llama a una interrupción cuando genera una excepción, sino que empuja un valor especial a la pila, entonces no es clasificable como no pura. Creo que el error NAN flotante IEEE se genera utilizando un valor especial y no una interrupción, por lo que cualquier excepción planteada al hacer matemáticas de coma flotante se puede clasificar como libre de efectos secundarios ya que el valor no se lee desde ningún estado global, pero sí una constante codificada en la FPU.
Considerando todos los requisitos para que un código pieza sea puro, las excepciones basadas en código y el azúcar sintáctico sintonizan todas las casillas, no modifican ningún estado, no tienen ninguna interacción con sus funciones de llamada ni nada externo su invocación, y son referencialmente transparentes, pero solo una vez que el compilador ha seguido su propio código.
Como todas las discusiones puras vs no puras, he excluido cualquier noción de tiempos de ejecución u operaciones de memoria y he operado bajo el supuesto de que cualquier función que PUEDA implementarse puramente se implementa puramente independientemente de su implementación real. Tampoco tengo evidencia del reclamo de excepción IANE punto flotante NAN.
La excepción no se devuelve simplemente como un valor de retorno. – Sjoerd
Mover para reabrir esto es claramente una pregunta, mientras que la naturaleza más teórica aún es válida para este sitio web. – Woot4Moo
Se debe migrar a [programadores.se] – Daenyth