Concurrency and parallelism
CP.201
Сигналы
???Обработка сигналов UNIX???. Может быть стоит напомнить, как мало функций, которые async-signal-safe, и как общаться с обработчиком сигнала (лучше всего вероятно "вообще не общаться")
E: Обработка ошибок
Обработка ошибок включает в себя:
- Обнаружение ошибки
- Передачу информации об ошибке в какой-то код обработчика
- Сохранение корректного состояния программы
- Предотвращение утечек ресурсов
Невозможно восстановиться от всех ошибок. Если восстановление от ошибки невозможно, важно быстро "выйти" определённым образом. Стратегия обработки ошибок должна быть простой, иначе она становится источником ещё худших ошибок. Неопробованный и редко выполняемый код обработки ошибок сам по себе является источником многих ошибок.
Правила предназначены для предотвращения нескольких типов ошибок:
- Нарушения типов (например, неправильное использование
unionов и приведений типов) - Утечки ресурсов (включая утечки памяти)
- Ошибки границ
- Ошибки времени жизни (например, доступ к объекту после его
delete) - Ошибки сложности (логические ошибки, вызванные чрезмерно сложным выражением идей)
- Ошибки интерфейса (например, неожиданное значение передано через интерфейс)
Резюме правил обработки ошибок:
- E.1: Разработайте стратегию обработки ошибок в начале проектирования
- E.2: Выбросьте исключение, чтобы сигнализировать, что функция не может выполнить свою задачу
- E.3: Используйте исключения только для обработки ошибок
- E.4: Спроектируйте стратегию обработки ошибок на основе инвариантов
- E.5: Пусть конструктор установит инвариант, и выбросьте исключение, если не может
- E.6: Используйте RAII для предотвращения утечек
- E.7: Укажите ваши предусловия
- E.8: Укажите ваши постусловия
- E.12: Используйте
noexceptкогда выход из функции из-заthrowневозможен или неприемлем - E.13: Никогда не выбрасывайте исключение, будучи прямым владельцем объекта
- E.14: Используйте специально разработанные пользовательские типы как исключения (не встроенные типы)
- E.15: Выбрасывайте по значению, ловите исключения из иерархии по ссылке
- E.16: Деструкторы, удаление,
swapи копирование/перемещение типа исключения никогда не должны завершаться неудачей - E.17: Не пытайтесь поймать каждое исключение в каждой функции
- E.18: Минимизируйте использование явного
try/catch - E.19: Используйте объект
final_actionдля выражения очистки, если нет подходящего дескриптора ресурса
- E.25: Если вы не можете выбрасывать исключения, имитируйте RAII для управления ресурсами
- E.26: Если вы не можете выбрасывать исключения, рассмотрите быстрый отказ
- E.27: Если вы не можете выбрасывать исключения, используйте коды ошибок систематически
- E.28: Избегайте обработки ошибок на основе глобального состояния (например
errno)