Я думаю, что лучший способ думать об этом с точки зрения состояния программы. Вы не хотите, чтобы неудачная операция повредила состояние программы. В этом документе описывается понятие "исключительная безопасность".
В общем, вам сначала нужно решить, какой уровень безопасности исключений должна гарантировать функция. Уровни
- Базовая гарантия
- Сильная гарантия
- Гарантия NoThrow
Основная гарантия просто означает, что при возникновении исключения или другой ошибки не происходит утечка ресурсов, строгая гарантия говорит о том, что состояние программы откатывается до исключения, а методы nothrow никогда не генерируют исключения.
Я лично использую исключения, когда происходит непредвиденный сбой во время выполнения. Неожиданное для меня означает, что такой сбой не должен происходить при нормальном ходе операций. Время выполнения означает, что ошибка связана с состоянием какого-либо внешнего компонента вне моего контроля, а не из-за логических ошибок с моей стороны. Я использую ASSERT () для обнаружения логических ошибок и булевых возвращаемых значений для ожидаемых ошибок.
Почему? ASSERT не скомпилирован в код выпуска, поэтому я не обременяю своих пользователей проверкой ошибок на свои собственные ошибки. Вот для чего нужны юнит-тесты и ASSERTS. Логическое значение, потому что выдача исключения может дать неправильное сообщение. Исключения тоже могут быть дорогими. Если я выбрасываю исключения в ходе обычного выполнения приложения, то я не могу использовать отличную функцию исключения «Catch on thrown» отладчика MS Visual Studio, где я могу заставить отладчик прерывать программу в момент, когда any генерируется исключение, а не по умолчанию остановка только на необработанных (аварийных) исключениях.
Чтобы увидеть технику C ++ для базовой гарантии, воспользуйтесь Google "RAII" (Resource Acquisition is Initialiation). Это метод, в котором вы заключаете ресурс в объект, конструктор которого выделяет ресурс, а чей деструктор освобождает ресурс. Поскольку исключения C ++ разматывают стек, это гарантирует, что ресурсы освобождаются перед лицом исключений. Вы можете использовать эту технику для отката состояния программы перед лицом исключения. Просто добавьте метод «Фиксация» к объекту, и если объект не был зафиксирован до его уничтожения, запустите операцию «Откат», которая восстанавливает состояние программы в деструкторе.