Безопасность Исключения гарантия, первоначально [ править ] формализуется Дэвид Абрахамс , [1] [2] представляют собой набор договорных принципов , которые библиотечные исполнители и клиенты могут использовать при рассуждении об обработке исключений безопасности на любом языке программирования , который использует исключения, в частности , C ++ .
Существует несколько уровней безопасности исключений (в порядке убывания безопасности): [3]
- Гарантия отсутствия выброса , также известная как прозрачность отказов : выполнение операций гарантировано успешным и удовлетворяет всем требованиям даже в исключительных ситуациях. Если возникает исключение, оно обрабатывается внутри компании и не отслеживается клиентами.
- Сильная безопасность исключений , также известная как семантика фиксации или отката : операции могут завершаться ошибкой, но неудачные операции гарантированно не имеют побочных эффектов, оставляя исходные значения нетронутыми. [4]
- Базовая безопасность исключений , также известная как гарантия отсутствия утечек : частичное выполнение неудачных операций может привести к побочным эффектам, но все инварианты сохраняются, и утечки ресурсов (включая утечки памяти ) отсутствуют. Любые сохраненные данные будут содержать допустимые значения, которые могут отличаться от исходных значений.
- Безопасность без исключений : никаких гарантий не дается.
Обычно для написания надежного кода на таких языках требуется по крайней мере базовая безопасность исключений. Иногда бывает трудно достичь более высокого уровня безопасности, и это может привести к накладным расходам из-за дополнительного копирования. Ключевым механизмом безопасности исключений является finally
предложение или аналогичный синтаксис обработки исключений , который гарантирует, что определенный код всегда запускается при выходе из блока, в том числе с помощью исключений. Несколько языков есть конструкции , которые упрощают это, в частности , используя Dispose рисунок , названный как using
, with
, или try
--with-ресурсы.
Пример [ править ]
Рассмотрим умный векторный тип, такой как C ++ или Java . Когда элемент добавляется к вектору , вектор должен фактически добавляться во внутренний список объектов и обновлять поле счетчика, в котором указано, сколько объектов находится в нем . Также может потребоваться выделить новую память, если существующей емкости недостаточно.std::vector
ArrayList
x
v
x
v
Альтернативы исключительной безопасности:
- Гарантия отсутствия броска
- Реализовано путем обеспечения того, чтобы выделение памяти никогда не происходило сбоем, или путем определения
insert
поведения функции при сбое выделения (например, путем возврата функцией логического результата, указывающего, произошла ли вставка). - Сильная безопасность исключений
- Реализуется путем выполнения любого необходимого выделения памяти, а затем перестановки буферов, если ошибок не обнаружено ( идиома copy-and-swap ). В этом случае, либо введение
x
вv
преуспевает, илиv
остается неизменным , несмотря на провал распределения. - Базовая безопасность исключений
- Реализовано путем обеспечения того, чтобы поле count гарантированно отражало окончательный размер
v
. Например, если обнаружена ошибка,insert
функция может полностью освободитьv
и сбросить свое поле счетчика до нуля. В случае сбоя утечка ресурсов не происходит, ноv
старое значение не сохраняется. - Безопасность без исключений
- Ошибка вставки может привести к повреждению содержимого
v
, неправильному значению в поле счетчика или утечке ресурсов .
Ссылки [ править ]
- ^ Дэвид Абрахамс . «Исключительная безопасность в универсальных компонентах» . Проверено 29 августа 2008 . CS1 maint: обескураженный параметр ( ссылка )
- ^ Дэйв Абрахамс (2000). Исключительная безопасность в общих компонентах . Общее программирование . Конспект лекций по информатике . 1766 . Springer . С. 69–79. DOI : 10.1007 / 3-540-39953-4_6 . ISBN 978-3-540-41090-4.
- ^ Бьярн Страуструп . «Приложение E: Безопасность исключений стандартной библиотеки в« Языке программирования C ++ » » (3-е изд.). Эддисон-Уэсли. ISBN 0-201-88954-4. Отсутствует или пусто
|url=
( справка ) - ^ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1997/N1077.asc
Внешние ссылки [ править ]
- Херб Саттер: Исключительный C ++: 47 инженерных задач, проблемы программирования и решения, 2000 г.
- Джон Калб: Безопасное для исключений кодирование на C ++ с помощью C ++ прямо сейчас! Презентации 2012 г. по безопасности исключений.
- Связанное обсуждение Stackoverflow: C ++: вы (действительно) пишете код, безопасный для исключений