Исключительная безопасность

редактировать

Исключительная безопасность Гарантии, первоначально оформленные Дэвидом Абрахамсом, представляют собой набор договорных руководящие принципы, которые разработчики библиотеки и клиенты могут использовать при рассуждении о обработке исключений безопасности на любом языке программирования, который использует исключения, особенно C ++.

Существует несколько уровней безопасности исключений (в порядке убывания безопасности) :

  1. Гарантия отсутствия выброса, также известная как прозрачность отказа : Операции гарантированно завершатся успешно и удовлетворяют всем требованиям даже в исключительных ситуациях. Если возникает исключение, оно будет обрабатываться внутри компании и не будет наблюдаться клиентами.
  2. Сильная безопасность исключений, также известная как семантика фиксации или отката : операции могут завершиться неудачно, но невыполненные операции гарантированно не имеют побочных эффектов, оставляя исходные значения нетронутыми.
  3. Базовая безопасность исключений, также известная как гарантия отсутствия утечек : частичное выполнение неудачных операций может привести к побочным эффектам, но все инварианты сохраняются, и отсутствуют утечки ресурсов (включая утечки памяти ). Любые сохраненные данные будут содержать допустимые значения, которые могут отличаться от исходных значений.
  4. Безопасность исключений : Никаких гарантий не дается.

Обычно для написания надежного кода на таких языках требуется по крайней мере базовая безопасность в отношении исключений. Иногда бывает трудно достичь более высокого уровня безопасности, и это может привести к накладным расходам из-за дополнительного копирования. Ключевым механизмом для обеспечения безопасности исключений является предложение finallyили аналогичный синтаксис обработки исключений, который гарантирует, что определенный код всегда запускается при выходе из блока, в том числе с помощью исключений. В нескольких языках есть конструкции, которые упрощают это, в частности, с использованием шаблона удаления, названного как с использованием, сили try-with-resources.

Пример

Рассмотрим интеллектуальный векторный тип, такой как C ++ std :: vectorили Java ArrayList. Когда элемент xдобавляется к вектору v, вектор должен фактически добавить xво внутренний список объектов и обновить поле подсчета, в котором указано, сколько объекты находятся в v. Также может потребоваться выделить новую память, если существующей емкости недостаточно.

Альтернативы безопасности при исключениях:

Гарантия отсутствия выброса
Реализована путем обеспечения того, что выделение памяти никогда не сработает, или путем определения поведения функции insertпри сбое выделения (для Например, функция возвращает логический результат, указывающий, имела ли место вставка).
Строгая безопасность исключений
Реализуется путем выполнения любого необходимого выделения сначала, а затем перестановки буферов, если ошибок не обнаружено (идиома [ru ]). В этом случае либо вставка xв vзавершается успешно, либо vостается неизменным, несмотря на сбой выделения.
Базовая безопасность исключений
Реализуется путем обеспечения того, чтобы поле счетчика гарантированно отражало окончательный размер v. Например, при обнаружении ошибки функция insertможет полностью освободить vи сбросить его поле счетчика на ноль. При сбое не происходит утечки ресурсов, но старое значение vне сохраняется.
Отсутствие защиты от исключений
Ошибка вставки может привести к повреждению содержимого в v, неверное значение в поле счетчика или утечка ресурсов.
Ссылки
  1. ^Дэвид Абрахамс. «Исключительная безопасность в общих компонентах». Проверено 29 августа 2008 г.
  2. ^Дэйв Абрахамс (2000). Исключительная безопасность в общих компонентах. Общее программирование. Конспект лекций по информатике. 1766 . Спрингер. С. 69–79. DOI : 10.1007 / 3-540-39953-4_6. ISBN 978-3-540-41090-4.
  3. ^Бьярн Страуструп. «Приложение E: Безопасность исключений стандартной библиотеки в« Языке программирования C ++ »» (3-е изд.). Эддисон-Уэсли. ISBN 0-201-88954-4. Отсутствует или пусто | url =()
  4. ^http: // www. open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1077.asc
Внешние ссылки
Последняя правка сделана 2021-05-19 09:29:51
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте