Hay muchos requisitos necesarios para que un sistema transmita y maneje adecuadamente las excepciones. También hay muchas opciones para elegir un idioma para implementar el concepto.
Requisitos para excepciones (sin ningún orden en particular):
Documentación : un idioma debe tener un medio para documentar excepciones que una API puede generar. Idealmente, este medio de documentación debería ser utilizable en la máquina para permitir que los compiladores e IDE brinden soporte al programador.
Transmitir situaciones excepcionales : esta es obvia, para permitir que una función transmita situaciones que impiden que la funcionalidad llamada realice la acción esperada. En mi opinión, hay tres grandes categorías de tales situaciones:
2.1 Errores en el código que hacen que algunos datos sean inválidos.
2.2 Problemas en la configuración u otros recursos externos.
2.3 Recursos inherentemente poco confiables (red, sistemas de archivos, bases de datos, usuarios finales, etc.). Estos son un poco arrinconados, ya que su naturaleza poco confiable debería hacernos esperar sus fallas esporádicas. En este caso, ¿estas situaciones se consideran excepcionales?
Proporcione suficiente información para que el código lo maneje : las excepciones deben proporcionar suficiente información a la persona que llama para que pueda reaccionar y posiblemente manejar la situación. la información también debe ser suficiente para que, cuando se registre, estas excepciones proporcionen suficiente contexto a un programador para identificar y aislar las declaraciones ofensivas y proporcionar una solución.
Proporcione confianza al programador sobre el estado actual del estado de ejecución de su código : las capacidades de manejo de excepciones de un sistema de software deben estar lo suficientemente presentes como para proporcionar las garantías necesarias mientras se mantiene alejado del programador para que pueda concentrarse en la tarea en mano.
Para cubrir estos, se implementaron los siguientes métodos en varios idiomas:
Excepciones marcadas Proporcionan una excelente manera de documentar excepciones, y teóricamente, cuando se implementa correctamente, debe proporcionar una amplia garantía de que todo está bien. Sin embargo, el costo es tal que muchos sienten que es más productivo eludir simplemente al tragar excepciones o volver a lanzarlas como excepciones no controladas. Cuando se usan excepciones marcadas de manera inapropiada, se pierde toda su utilidad. Además, las excepciones marcadas dificultan la creación de una API estable en el tiempo. Las implementaciones de un sistema genérico dentro de un dominio específico traerá una carga de situación excepcional que sería difícil de mantener utilizando únicamente excepciones marcadas.
Excepciones no verificadas: mucho más versátiles que las excepciones marcadas, no logran documentar adecuadamente las posibles situaciones excepcionales de una implementación determinada. Dependen de la documentación ad-hoc, si es que lo hacen. Esto crea situaciones en las que la naturaleza poco confiable de un medio está enmascarada por una API que da la apariencia de confiabilidad. Además, cuando se lanzan, estas excepciones pierden su significado a medida que avanzan de nuevo a través de las capas de abstracción. Dado que están mal documentados, un programador no puede enfocarse específicamente en ellos y, a menudo, necesita lanzar una red mucho más amplia de la necesaria para garantizar que los sistemas secundarios, en caso de que fallen, no derriben todo el sistema. Lo que nos lleva de vuelta al problema de la deglución, verificó las excepciones proporcionadas.
Tipos de retorno de estado múltiple Aquí es confiar en un conjunto disjunto, tupla u otro concepto similar para devolver el resultado esperado o un objeto que representa la excepción. Aquí no se desenrolla la pila, no se corta el código, todo se ejecuta normalmente, pero el valor de retorno debe validarse por error antes de continuar. Realmente no he trabajado con esto todavía, así que no puedo comentar por experiencia. Reconozco que resuelve algunas excepciones de problemas sin pasar por el flujo normal, pero aún sufrirá los mismos problemas que las excepciones comprobadas como ser tedioso y constantemente "en su cara".
Entonces la pregunta es:
¿Cuál es su experiencia en este asunto y qué, según usted, es el mejor candidato para hacer un buen sistema de manejo de excepciones para un idioma?
EDITAR: Pocos minutos después de escribir esta pregunta, me encontré con esta publicación , ¡espeluznante!
noexcept
historia en C ++ puede proporcionar muy buenas ideas para EH en C # y Java también.)