Исключительная безопасность
редактировать
Исключительная безопасность Гарантии, первоначально оформленные Дэвидом Абрахамсом, представляют собой набор договорных руководящие принципы, которые разработчики библиотеки и клиенты могут использовать при рассуждении о обработке исключений безопасности на любом языке программирования, который использует исключения, особенно C ++.
Существует несколько уровней безопасности исключений (в порядке убывания безопасности) :
- Гарантия отсутствия выброса, также известная как прозрачность отказа : Операции гарантированно завершатся успешно и удовлетворяют всем требованиям даже в исключительных ситуациях. Если возникает исключение, оно будет обрабатываться внутри компании и не будет наблюдаться клиентами.
- Сильная безопасность исключений, также известная как семантика фиксации или отката : операции могут завершиться неудачно, но невыполненные операции гарантированно не имеют побочных эффектов, оставляя исходные значения нетронутыми.
- Базовая безопасность исключений, также известная как гарантия отсутствия утечек : частичное выполнение неудачных операций может привести к побочным эффектам, но все инварианты сохраняются, и отсутствуют утечки ресурсов (включая утечки памяти ). Любые сохраненные данные будут содержать допустимые значения, которые могут отличаться от исходных значений.
- Безопасность исключений : Никаких гарантий не дается.
Обычно для написания надежного кода на таких языках требуется по крайней мере базовая безопасность в отношении исключений. Иногда бывает трудно достичь более высокого уровня безопасности, и это может привести к накладным расходам из-за дополнительного копирования. Ключевым механизмом для обеспечения безопасности исключений является предложение finally
или аналогичный синтаксис обработки исключений, который гарантирует, что определенный код всегда запускается при выходе из блока, в том числе с помощью исключений. В нескольких языках есть конструкции, которые упрощают это, в частности, с использованием шаблона удаления, названного как с использованием
, с
или try
-with-resources.
Пример
Рассмотрим интеллектуальный векторный тип, такой как C ++ std :: vector
или Java ArrayList
. Когда элемент x
добавляется к вектору v
, вектор должен фактически добавить x
во внутренний список объектов и обновить поле подсчета, в котором указано, сколько объекты находятся в v
. Также может потребоваться выделить новую память, если существующей емкости недостаточно.
Альтернативы безопасности при исключениях:
- Гарантия отсутствия выброса
- Реализована путем обеспечения того, что выделение памяти никогда не сработает, или путем определения поведения функции
insert
при сбое выделения (для Например, функция возвращает логический результат, указывающий, имела ли место вставка). - Строгая безопасность исключений
- Реализуется путем выполнения любого необходимого выделения сначала, а затем перестановки буферов, если ошибок не обнаружено (идиома [ru ]). В этом случае либо вставка
x
в v
завершается успешно, либо v
остается неизменным, несмотря на сбой выделения. - Базовая безопасность исключений
- Реализуется путем обеспечения того, чтобы поле счетчика гарантированно отражало окончательный размер
v
. Например, при обнаружении ошибки функция insert
может полностью освободить v
и сбросить его поле счетчика на ноль. При сбое не происходит утечки ресурсов, но старое значение v
не сохраняется. - Отсутствие защиты от исключений
- Ошибка вставки может привести к повреждению содержимого в
v
, неверное значение в поле счетчика или утечка ресурсов.
Ссылки
- ^Дэвид Абрахамс. «Исключительная безопасность в общих компонентах». Проверено 29 августа 2008 г.
- ^Дэйв Абрахамс (2000). Исключительная безопасность в общих компонентах. Общее программирование. Конспект лекций по информатике. 1766 . Спрингер. С. 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 ++ Now! 2012 презентации по безопасности исключений.
- Связанное обсуждение Stackoverflow: C ++: вы (правда) написать код безопасности исключения