Seguridad de excepción - Exception safety

Las garantías de seguridad de excepciones , originalmente formalizadas por David Abrahams , son un conjunto de pautas contractuales que los implementadores de bibliotecas y los clientes pueden usar al razonar sobre la seguridad del manejo de excepciones en cualquier lenguaje de programación que use excepciones, particularmente C ++ .

Hay varios niveles de seguridad de excepción (en orden decreciente de seguridad):

  1. Garantía de no tirar , también conocida como transparencia de fallas : las operaciones están garantizadas para tener éxito y satisfacer todos los requisitos incluso en situaciones excepcionales. Si ocurre una excepción, será manejada internamente y no observada por los clientes.
  2. Seguridad de excepción sólida , también conocida como semántica de confirmación o reversión : las operaciones pueden fallar, pero se garantiza que las operaciones fallidas no tendrán efectos secundarios, dejando intactos los valores originales.
  3. Seguridad básica de excepción , también conocida como garantía sin fugas : la ejecución parcial de operaciones fallidas puede provocar efectos secundarios, pero se conservan todos los invariantes y no hay fugas de recursos (incluidas las fugas de memoria ). Cualquier dato almacenado contendrá valores válidos que pueden diferir de los valores originales.
  4. Seguridad sin excepción : No se ofrecen garantías.

Por lo general, se requiere al menos seguridad básica de excepción para escribir código robusto en dichos lenguajes. A veces, puede ser difícil lograr niveles más altos de seguridad y pueden incurrir en gastos generales debido al copiado adicional. Un mecanismo clave para la seguridad de las excepciones es una finally cláusula, o una sintaxis similar de manejo de excepciones , que asegura que cierto código siempre se ejecute cuando se sale de un bloque, incluso por excepciones. Varias lenguas tienen construcciones que simplifican esto, sobre todo mediante el patrón de disponer , nombrado como using , with , o try -con-recursos.

Ejemplo

Considere un tipo de vector inteligente, como C ++ o Java . Cuando se agrega un elemento a un vector , el vector debe agregarse a la lista interna de objetos y actualizar un campo de conteo que dice cuántos objetos hay . También es posible que deba asignar nueva memoria si la capacidad existente no es suficiente. std::vectorArrayListxvxv

Alternativas de seguridad de excepción:

Garantía de no tirar
Implementada asegurando que la asignación de memoria nunca falle, o definiendo el insert comportamiento de la función en caso de falla de asignación (por ejemplo, haciendo que la función devuelva un resultado booleano que indique si la inserción tuvo lugar).
Fuerte seguridad de excepción
Se implementa haciendo primero cualquier asignación necesaria, y luego intercambiando búferes si no se encuentran errores (el idioma copy-and-swap  [ ru ] ). En este caso, la inserción de x en se realiza v correctamente o v permanece sin cambios a pesar del error de asignación.
Seguridad básica de excepción
Se implementa asegurando que se garantiza que el campo de recuento refleje el tamaño final de v . Por ejemplo, si se encuentra un error, la insert función podría desasignar completamente v y restablecer su campo de recuento a cero. En caso de falla, no se filtran recursos, pero v no se conserva el valor anterior.
Seguridad sin excepción
Un error de inserción puede provocar la corrupción del contenido v , un valor incorrecto en el campo de recuento o una pérdida de recursos .

Referencias

  1. ^ David Abrahams . "Excepción-Seguridad en Componentes Genéricos" . Consultado el 29 de agosto de 2008 .
  2. ^ Dave Abrahams (2000). Excepción-seguridad en componentes genéricos . Programación genérica . Apuntes de conferencias en informática . 1766 . Springer . págs. 69–79. doi : 10.1007 / 3-540-39953-4_6 . ISBN   978-3-540-41090-4 .
  3. ^ Bjarne Stroustrup . "Apéndice E: Seguridad de excepción de biblioteca estándar en" El lenguaje de programación C ++ " " (3ª ed.). Addison-Wesley. ISBN   0-201-88954-4 . Falta o vacío |url= ( ayuda )
  4. ^ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1077.asc

enlaces externos