Estoy familiarizado con una docena de lenguajes de programación que tienen excepciones de alguna manera, sin embargo, llegué a ser testigo de dos tendencias "patológicas".
No parece haber un patrón común o jerarquía de excepciones. Básicamente, cada idioma presenta su propia versión, y si las excepciones se convierten en el estándar, los tipos de excepciones que se encuentran en el estándar serían bastante arbitrarios (principalmente aquellos que se implementaron al crear herramientas de lenguaje, como leer el código fuente de cadena o una excepción para invocar al depurador, o la que ocurre cuando no se puede encontrar el archivo, etc.)
Los programas de usuario rara vez reutilizan las excepciones definidas por el lenguaje. Habrá generalmente una o dos excepciones populares ("no implementar", por ejemplo). Aunque la mayoría de las veces los programadores crearán sus propias excepciones. (Compare esto con, por ejemplo, crear nuevos tipos numéricos o nuevos tipos de colección).
Esto me parece una terrible omisión. ¿Cómo es que nadie sabe qué tipo de errores se necesitarán en los programas de usuario? Esperaba que hubiera una especie de jerarquía agradable, similar a los tipos numéricos, colecciones, sistema de objetos, etc.
Peor aún, Goolge y Wikipedia proporcionan muy poca ayuda sobre el tema. Hasta ahora solo he encontrado un documento sobre la excepción funcional que se abre en un pasaje:
Este artículo argumenta que la programación funcional perezosa no solo hace innecesario el mecanismo incorporado de manejo de excepciones, sino que proporciona una herramienta poderosa para desarrollar y transformar programas que usan excepciones
(Una teoría funcional de las excepciones, Mike Spivey, 1988)
Pero creo que las excepciones son buenas. No quiero transformar programas que usan excepciones, por el contrario, quiero hacer que el uso de excepciones sea menos caótico.
La pregunta:
¿Existe una teoría de excepciones? Si es así, ¿cómo se llama? ¿Cuáles son, si las hay, la piedra angular que describe su base?
LookupError
estaría perfectamente bien para cada contenedor personalizado, pero mucha gente ni siquiera sabe que existe.Respuestas:
Hay una gran cantidad de publicaciones sobre excepciones, con bastantes investigaciones teóricas. Aquí hay una lista desestructurada y lejos de ser completa con algunos ejemplos. Lo siento, no tengo tiempo en este momento para una respuesta más centrada.
fuente
No sé si existe o no una teoría, pero puede haber una ciencia experimental pragmática emergente.
La mejor fuente que se me ocurre es Bjarne Stroustrup, The Design and Evolution of C ++, Addison-Wesley, 1994 . Si recuerdo correctamente (es un libro muy bueno y la gente me lo sigue pidiendo prestado y no me lo devuelve, por lo que no tengo una copia en este momento) hay un capítulo sobre excepciones. El comité C ++ bajo Stroustrup requirió mucha evidencia empírica de que una característica propuesta era necesaria antes de que estuvieran dispuestos a agregarla a la definición del lenguaje. La página de Wikipedia sobre excepciones tiene la siguiente cita de ese libro:
En C ++, la verdadera victoria es RAII , lo que hace que sea mucho más fácil manejar la desasignación de recursos durante los errores. (No acabar con la necesidad de
throw
etry
-catch
, sino que significa que no es necesariofinally
.)Creo que lo que los convenció de que necesitaban excepciones son los contenedores genéricos: el escritor del contenedor no sabe nada sobre los tipos de errores que los objetos contenidos podrían necesitar devolver (mucho menos cómo manejarlos), pero el código que insertó esos objetos en el El contenedor debe saber algo sobre la interfaz de esos objetos. Pero como no sabemos nada acerca de qué tipo de errores pueden arrojar los objetos contenidos, no podemos estandarizar los tipos de excepción. (Contradictoriamente: si pudiéramos estandarizar los tipos de excepción, entonces no necesitaríamos excepciones).
La otra cosa que la gente parece haber aprendido a lo largo de los años es que las especificaciones de excepción son difíciles de poner correctamente en un idioma. Vea, por ejemplo, esto: http://www.gotw.ca/publications/mill22.htm , o esto: http://www.gotw.ca/gotw/082.htm . (Y no se trata solo de C ++, los programadores de Java también tienen largos argumentos sobre sus experiencias con excepciones marcadas frente a no marcadas ).
Un poco sobre la historia de las excepciones. El artículo clásico es: John B. Goodenough: "Manejo de excepciones: problemas y una notación propuesta", Commun. ACM 18 (12): 683-696, 1975. Pero antes se conocían excepciones. Mesa los tenía aproximadamente en 1974, y PL / I puede haberlos tenido también. Ada tenía un mecanismo de excepción antes de 1980. Creo que las excepciones de C ++ fueron más influenciadas por la experiencia con el lenguaje de programación CLU de Barbara Liskov de alrededor de 1976. Barbara Liskov: "Una historia de CLU", en Historia de los lenguajes de programación --- II , Thomas J. Bergin, Jr. y Richard G. Gibson, Jr. (Eds.). pp. 471-510, ACM, 1996 .
fuente
serious-condition
vssimple-condition
. Ahora también estoy leyendo JL Austing, donde clasifica los errores (no relacionados con la programación) en grupos en función de cómo el sistema no pudo realizar la tarea (por ejemplo, partes incorrectas utilizadas frente a intenciones poco sinceras). Lo cual no es inmediatamente aplicable a la programación, pero podría ser después de algún refinamiento.very strong objection
excepciones en contra en C ++ provienen de dos hechos: no hayfinally
constructo y nadie más usa excepciones. El primer problema también agrava el segundo. Es decir, cuando no tienefinally
, no puede cerrar el recurso cuando ocurre una excepción. Debido a que nadie usa excepciones, todas las funciones / API las evitan, debe invertir mucho reconstruyendo toda la infraestructura tradicional de C ++ envolviendo todas las funciones con sus excepciones para comenzar a obtener beneficios de ellas en su código. Pero la falta definally
hace que este enfoque sea imposible también.Permítanme señalar que las excepciones son un caso de efecto computacional . Otros efectos computacionales son estado mutable, E / S, no determinismo, continuaciones y muchos otros. Por lo tanto, su pregunta podría formularse de manera más general: ¿cómo formamos jerarquías de efectos computacionales, cómo los organizamos y por qué tenemos los que tenemos, y no otros, etc.
fuente