Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

Пример [ править ]

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

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

Гарантия отсутствия броска
Реализовано путем обеспечения того, чтобы выделение памяти никогда не происходило сбоем, или путем определения insertповедения функции при сбое выделения (например, путем возврата функцией логического результата, указывающего, произошла ли вставка).
Сильная безопасность исключений
Реализуется путем выполнения любого необходимого выделения памяти, а затем перестановки буферов, если ошибок не обнаружено ( идиома copy-and-swap  [ ru ] ). В этом случае, либо введение xв vпреуспевает, или vостается неизменным , несмотря на провал распределения.
Базовая безопасность исключений
Реализовано путем обеспечения того, чтобы поле count гарантированно отражало окончательный размер v. Например, если обнаружена ошибка, insertфункция может полностью освободить vи сбросить свое поле счетчика до нуля. В случае сбоя утечка ресурсов не происходит, но vстарое значение не сохраняется.
Безопасность без исключений
Ошибка вставки может привести к повреждению содержимого v, неправильному значению в поле счетчика или утечке ресурсов .

Ссылки [ править ]

  1. ^ Дэвид Абрахамс . «Исключительная безопасность в универсальных компонентах» . Проверено 29 августа 2008 . CS1 maint: обескураженный параметр ( ссылка )
  2. ^ Дэйв Абрахамс (2000). Исключительная безопасность в общих компонентах . Общее программирование . Конспект лекций по информатике . 1766 . Springer . С. 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

Внешние ссылки [ править ]