Manejo de excepciones

Construcción de lenguaje de programación para condiciones especiales

En informática y programación informática , el manejo de excepciones es el proceso de respuesta a la ocurrencia 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 registrado previamente ; los detalles de cómo se hace esto dependen de si se trata de una excepción de hardware o software y de cómo se implementa la excepción de software.

Las excepciones se definen en diferentes capas de un sistema informático, y las capas típicas son las interrupciones definidas por la CPU , las señales definidas por el sistema operativo (SO) y las excepciones definidas por el lenguaje de programación . Cada capa requiere diferentes formas de manejo de excepciones, aunque pueden estar relacionadas entre sí; por ejemplo, una interrupción de la CPU se puede convertir en una señal del SO. Algunas excepciones, especialmente las de hardware, se pueden manejar con tanta elegancia que la ejecución puede reanudarse donde se interrumpió.

Definición

La definición de una 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 con un conjunto anormal de argumentos. El mecanismo de manejo de excepciones maneja entonces la excepción. [3]

La condición previa y la definición de excepción son subjetivas . El conjunto de circunstancias "normales" está definido completamente por el programador, por ejemplo, el programador puede considerar que la división por cero no está definida, por lo tanto una excepción, o idear algún comportamiento como devolver cero o un valor especial "DIVISIÓN POR CERO" (evitando la necesidad de 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 errores de memoria insuficiente [8] ), o que la rutina haya detectado una condición normal que requiere un manejo especial, por ejemplo, atención, fin de archivo. [9] La presión social es una influencia importante en el alcance de las excepciones y el uso de mecanismos de manejo de excepciones, es decir, "ejemplos de uso, que normalmente se encuentran en bibliotecas centrales, 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 de código de una organización". [10]

El manejo de excepciones resuelve el problema de los semipredicados , 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] Si se adopta una visión amplia, los errores pueden considerarse un subconjunto adecuado de las excepciones, [12] y los mecanismos de error explícitos como errno pueden considerarse formas (verbosas) 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]

Historia

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] El manejo de excepciones de software se desarrolló 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.

Excepciones de hardware

No existe un consenso claro en cuanto al 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 controlador 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.

Excepciones de punto flotante IEEE 754

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 lenguaje".

De manera predeterminada, una excepción IEEE 754 se puede reanudar y se maneja sustituyendo un valor predefinido para diferentes excepciones, por ejemplo, infinito para una excepción de división por cero, y proporcionando indicadores de estado para verificar más tarde si la excepción ocurrió (consulte el lenguaje de programación C99 para un ejemplo típico 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 utilizando una implementación rápida y directa; verificar si falló probando indicadores de estado; y luego, si es necesario, llamar a una implementación más lenta y numéricamente más robusta. [18]

El estándar IEEE 754 utiliza el término "trapping" 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 presustitución no predeterminada de un valor seguida de una reanudación, para manejar de manera concisa las singularidades removibles . [18] [19] [20]

El comportamiento predeterminado de manejo de excepciones IEEE 754 de reanudación tras la sustitución previa de un valor predeterminado evita los riesgos inherentes a cambiar el flujo de control del programa en caso de 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 en caso de error aritmético. William Kahan afirma que el comportamiento predeterminado de manejo de excepciones IEEE 754 habría evitado esto. [19]

En lenguajes de programación

En programación informática , existen varios mecanismos de lenguaje para el manejo de excepciones . El término excepción se utiliza normalmente para denotar una estructura de datos que almacena información sobre una condición excepcional. Un mecanismo para transferir el control, o generar una excepción, se conoce como throw ; se dice que la excepción es thrown . La ejecución se transfiere a un catch .

En las interfaces de usuario

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 mecanismo try-catch típico. Por lo tanto, un componente puede garantizar que los errores de sus componentes secundarios se detecten y gestionen, y no se propaguen a los componentes principales.

Por ejemplo, en Vue, un componente detectaría errores implementandoerrorCaptured

Vue . component ( 'padre' , { plantilla : '<div><slot></slot></div>' , errorCaptured : ( err , vm , info ) => alert ( 'Ocurrió un error' ); }) Vue . component ( 'hijo' , { plantilla : '<div>{{ cause_error() }}</div>' })            

Cuando se usa así en el marcado:

< padre >  < hijo >/ hijo > </ padre >

El error producido por el componente secundario es detectado y manejado por el componente principal. [23]

Véase también

Referencias

  1. ^ ab Cristian, Flaviu (1980). "Manejo de excepciones y tolerancia a fallos de software". Proc. 10th Int. Symp. On Fault Tolerant Computing (6) (edición reimpresa FTCS-25): 531–540. CiteSeerX  10.1.1.116.8736 . doi :10.1109/TC.1982.1676035. OCLC  1029229019. S2CID  18345469.
  2. ^ Goodenough 1975b, págs. 683–684.
  3. ^ Goodenough 1975b, pág. 684.
  4. ^ Negro 1982, págs. 13-15.
  5. ^ Keeton, Cavaness y Friesen 2001:ArrayIndexOutOfBoundsException
  6. ^ Keeton, Cavaness y Friesen 2001:FileNotFoundException
  7. ^ "Mensaje de error inusual: java.io.SyncFailedException: error de sincronización". groups.google.com . Consultado el 17 de noviembre de 2023 .
  8. ^ "Comprender la excepción OutOfMemoryError". docs.oracle.com . Consultado el 17 de noviembre de 2023 .
  9. ^ Java:FileNotFoundException
  10. ^ Kiniry, JR (2006). "Excepciones en Java y Eiffel: dos extremos en el diseño y la aplicación de excepciones". Temas avanzados en técnicas de manejo de excepciones (PDF) . Apuntes de clase en informática. Vol. 4119. págs. 288–300. doi :10.1007/11818502_16. ISBN 978-3-540-37443-5. Número de identificación del sujeto  33283674.
  11. ^ ab Lang, Jun; Stewart, David B. (marzo de 1998). "Un estudio de la aplicabilidad de las técnicas de manejo de excepciones existentes a la tecnología de software en tiempo real basada en componentes". ACM Transactions on Programming Languages ​​and Systems . 20 (2): 276. CiteSeerX 10.1.1.33.3400 . doi :10.1145/276393.276395. S2CID  18875882. Quizás la forma más común de método de manejo de excepciones utilizado por los programadores de software es la técnica del "código de retorno" que se popularizó como parte de C y UNIX. 
  12. ^ Levin 1977, pág. 5.
  13. ^ ab Liskov, BH; Snyder, A. (noviembre de 1979). "Exception Handling in CLU" (PDF) . IEEE Transactions on Software Engineering . SE-5 (6): 546–558. doi :10.1109/TSE.1979.230191. S2CID  15506879 . Consultado el 19 de diciembre de 2021 .
  14. ^ "Resultados del diccionario de sinónimos para EXCEPCIÓN". www.merriam-webster.com . Consultado el 17 de noviembre de 2023 .
  15. ^ Levin 1977, pág. 4.
  16. ^ Smotherman, Mark. «Interrupts» . Consultado el 4 de enero de 2022 .
  17. ^ Hyde, Randall. "El arte del ensamblaje: Capítulo diecisiete". www.plantation-productions.com . Consultado el 22 de diciembre de 2021 .
  18. ^ de Xiaoye Li ; James Demmel (1994). "Algoritmos numéricos más rápidos mediante el manejo de excepciones", IEEE Transactions on Computers, 43(8)": 983–992. {{cite journal}}: Requiere citar revista |journal=( ayuda )
  19. ^ ab W. Kahan (5 de julio de 2005). "Una demostración de presustitución para ∞/∞" (PDF) . Archivado (PDF) desde el original el 10 de marzo de 2012.
  20. ^ Hauser, John R. (marzo de 1996). "Manejo de excepciones de punto flotante en programas numéricos". ACM Transactions on Programming Languages ​​and Systems . 18 (2): 139–174. doi : 10.1145/227699.227701 . S2CID  9820157.
  21. ^ "Límites de error". React . Consultado el 10 de diciembre de 2018 .
  22. ^ "API de Vue.js". Vue.js . Consultado el 10 de diciembre de 2018 .
  23. ^ "Manejo de errores con Vue.js". CatchJS . Consultado el 10 de diciembre de 2018 .
  • Black, Andrew P. (enero de 1982). Manejo de excepciones: el caso en contra (PDF) (PhD). Universidad de Oxford. CiteSeerX  10.1.1.94.5554 . OCLC  123311492.
  • Gabriel, Richard P. ; Steele, Guy L. (2008). Un patrón de evolución del lenguaje (PDF) . LISP50: Celebrando el 50 aniversario de Lisp. pp. 1–10. doi :10.1145/1529966.1529967. ISBN 978-1-60558-383-9.
  • Goodenough, John B. (1975a). Manejo estructurado de excepciones . Actas del 2º simposio ACM SIGACT-SIGPLAN sobre Principios de lenguajes de programación - POPL '75. págs. 204–224. doi :10.1145/512976.512997.
  • Goodenough, John B. (1975). "Manejo de excepciones: problemas y una notación propuesta" (PDF) . Comunicaciones de la ACM . 18 (12): 683–696. CiteSeerX  10.1.1.122.7791 . doi :10.1145/361227.361230. S2CID  12935051.
  • Levin, Roy (junio de 1977). Estructuras de programas para el manejo de condiciones excepcionales (PDF) (PhD). Universidad Carnegie-Mellon. DTIC ADA043449. Archivado (PDF) del original el 22 de diciembre de 2021.
  • Stroustrup, Bjarne (1994). El diseño y la evolución de C++ (1.ª ed.). Reading, Mass.: Addison-Wesley. ISBN 0-201-54330-3.
  • White, Jon L (mayo de 1979). NIL: una perspectiva (PDF) . Actas de la Conferencia de usuarios de Macsyma de 1979.
  • Keeton, Brian; Cavaness, Chuck; Friesen, Geoff (2001). Edición especial con Java 2 Standard Edition. Que Publishing. ISBN 978-0-7897-2468-7.
  • Un curso intensivo sobre las profundidades del manejo estructurado de excepciones en Win32 por Matt Pietrek - Microsoft Systems Journal (1997)
  • Artículo "Manejo de excepciones en C++" de Christophe de Dinechin
  • Artículo “Prácticas excepcionales” de Brian Goetz
  • Artículo "Manejo de excepciones orientado a objetos en Perl" de Arun Udaya Shankar
  • Artículo "Programación con excepciones en C++" de Kyle Loudon
  • Artículo “Excepciones no controladas: la controversia”
  • Diapositivas de la conferencia Políticas de manejo de excepciones de punto flotante (pdf p. 46) por William Kahan
  • Descripciones del repositorio de patrones de Portland
  • ¿Java necesita excepciones comprobadas?
Obtenido de "https://es.wikipedia.org/w/index.php?title=Manejo_de_excepciones&oldid=1187744531"