En informática y programación informática , el manejo de excepciones es el proceso de responder a la aparición de excepciones (condiciones anómalas o excepcionales que requieren un procesamiento especial) durante la ejecución de un programa . En general, una excepción interrumpe el flujo normal de ejecución y ejecuta un controlador de excepciones previamente registrado ; Los detalles de cómo se hace esto dependen de si se trata de una excepción de hardware o de software y de cómo se implementa la excepción de software.
Las excepciones están definidas por diferentes capas de un sistema informático, y las capas típicas son interrupciones definidas por la CPU , señales definidas por el sistema operativo (SO) , excepciones definidas por el lenguaje de programación . Cada capa requiere diferentes formas de manejo de excepciones, aunque pueden estar interrelacionadas; por ejemplo, una interrupción de la CPU podría convertirse en una señal del sistema operativo. Algunas excepciones, especialmente las de hardware, pueden manejarse con tanta elegancia que la ejecución puede reanudarse donde se interrumpió.
La definición de excepción se basa en la observación de que cada procedimiento tiene una condición previa , un conjunto de circunstancias por las cuales terminará "normalmente". [1] Un mecanismo de manejo de excepciones permite que el procedimiento genere una excepción [2] si se viola esta condición previa, [1] por ejemplo, si el procedimiento ha sido llamado sobre un conjunto anormal de argumentos. Luego, el mecanismo de manejo de excepciones maneja la excepción. [3]
La condición previa y la definición de excepción son subjetivas . El conjunto de circunstancias "normales" lo define enteramente el programador; por ejemplo, el programador puede considerar que la división por cero no está definida y, por lo tanto, es una excepción, o idear algún comportamiento como devolver cero o un valor especial de "DIVISIÓN CERO" (evitando la necesidad). para excepciones). [4] Las excepciones comunes incluyen un argumento no válido (por ejemplo, el valor está fuera del dominio de una función ), [5] un recurso no disponible (como un archivo faltante, [6] un error de unidad de red, [7] o fuera de errores de memoria [8] ), o que la rutina ha detectado una condición normal que requiere un manejo especial, por ejemplo, atención, fin de archivo. [9] La presión social tiene una influencia importante en el alcance de las excepciones y el uso de mecanismos de manejo de excepciones, es decir, "ejemplos de uso, que generalmente se encuentran en bibliotecas principales, y ejemplos de código en libros técnicos, artículos de revistas y foros de discusión en línea, y en los estándares del código de una organización". [10]
El manejo de excepciones resuelve el problema del semipredicado , ya que el mecanismo distingue los valores de retorno normales de los erróneos. En lenguajes sin manejo de excepciones incorporado, como C, las rutinas necesitarían señalar el error de alguna otra manera, como el código de retorno común y el patrón errno . [11] Desde una perspectiva amplia, los errores pueden considerarse como un subconjunto adecuado de excepciones, [12] y los mecanismos de error explícitos como errno pueden considerarse formas (detalladas) de manejo de excepciones. [11] Se prefiere el término "excepción" a "error" porque no implica que algo esté mal: una condición vista como un error por un procedimiento o programador puede no ser vista de esa manera por otro. [13]
El término "excepción" puede ser engañoso porque su connotación de "anomalía" indica que generar una excepción es anormal o inusual, [14] cuando en realidad generar la excepción puede ser una situación normal y habitual en el programa. [13] Por ejemplo, supongamos que una función de búsqueda para una matriz asociativa genera una excepción si la clave no tiene ningún valor asociado. Dependiendo del contexto, esta excepción de "clave ausente" puede ocurrir con mucha más frecuencia que una búsqueda exitosa. [15]
El primer manejo de excepciones de hardware se encontró en el UNIVAC I de 1951. El desbordamiento aritmético ejecutaba dos instrucciones en la dirección 0 que podían transferir el control o corregir el resultado. [16] Manejo de excepciones de software desarrollado en las décadas de 1960 y 1970. Posteriormente, el manejo de excepciones fue ampliamente adoptado por muchos lenguajes de programación a partir de la década de 1980.
No existe un consenso claro sobre el significado exacto de una excepción con respecto al hardware. [17] Desde el punto de vista de la implementación, se maneja de manera idéntica a una interrupción : el procesador detiene la ejecución del programa actual, busca el manejador de interrupciones en la tabla de vectores de interrupciones para esa excepción o condición de interrupción, guarda el estado y cambia el control. .
El manejo de excepciones en el estándar de punto flotante IEEE 754 se refiere en general a condiciones excepcionales y define una excepción como "un evento que ocurre cuando una operación en algunos operandos particulares no tiene un resultado adecuado para cada aplicación razonable. Esa operación puede señalar una o más excepciones". invocando el manejo predeterminado o, si se solicita explícitamente, un manejo alternativo definido por el idioma".
De forma predeterminada, una excepción IEEE 754 se puede reanudar y se maneja sustituyendo un valor predefinido para diferentes excepciones, por ejemplo, infinito por una excepción de división por cero, y proporcionando indicadores de estado para verificar posteriormente si se produjo la excepción (consulte el lenguaje de programación C99 para una descripción típica). ejemplo de manejo de excepciones IEEE 754). Un estilo de manejo de excepciones habilitado por el uso de indicadores de estado implica: primero calcular una expresión usando una implementación rápida y directa; comprobar si falló probando indicadores de estado; y luego, si es necesario, convocar una implementación más lenta y numéricamente más robusta. [18]
El estándar IEEE 754 utiliza el término "captura" para referirse a la llamada de una rutina de manejo de excepciones proporcionada por el usuario en condiciones excepcionales, y es una característica opcional del estándar. El estándar recomienda varios escenarios de uso para esto, incluida la implementación de una sustitución previa no predeterminada de un valor seguida de una reanudación, para manejar de manera concisa las singularidades extraíbles . [18] [19] [20]
El comportamiento predeterminado de manejo de excepciones IEEE 754 de reanudación después de la sustitución previa de un valor predeterminado evita los riesgos inherentes al cambio del flujo de control del programa en excepciones numéricas. Por ejemplo, el lanzamiento de la nave espacial Cluster en 1996 terminó en una explosión catastrófica debido en parte a la política de manejo de excepciones de Ada de abortar el cálculo por error aritmético. William Kahan afirma que el comportamiento predeterminado de manejo de excepciones IEEE 754 habría evitado esto. [19]
Los marcos de desarrollo web front-end , como React y Vue , han introducido mecanismos de manejo de errores donde los errores se propagan hacia arriba en la jerarquía de componentes de la interfaz de usuario (UI), de una manera análoga a cómo los errores se propagan hacia arriba en la pila de llamadas al ejecutar código. [21] [22] Aquí el mecanismo de límite de error sirve como análogo al típico mecanismo try-catch. Por lo tanto, un componente puede garantizar que los errores de sus componentes secundarios se detecten y manejen, y no se propaguen a los componentes principales.
Por ejemplo, en Vue, un componente detectaría errores al implementarerrorCaptured
Vista . componente ( 'padre' , { plantilla : '<div><slot></slot></div>' , errorCaptured : ( err , vm , info ) => alerta ( 'Ocurrió un error' ); }) Vue . componente ( 'niño' , { plantilla : '<div>{{ cause_error() }}</div>' })
Cuando se usa así en el marcado:
<padre> < niño > < / niño > </padre> _ _
El error producido por el componente secundario es detectado y manejado por el componente principal. [23]
ArrayIndexOutOfBoundsException
FileNotFoundException
FileNotFoundException
Quizás la forma más común de método de manejo de excepciones utilizada por los programadores de software es la técnica de "código de retorno" que se popularizó como parte de C y UNIX.
{{cite journal}}
: Citar diario requiere |journal=
( ayuda )