Исключения.
В плюсах их используешь не так уж и часто -- чаще всего ошибку нужно обрабатывать по месту вызова, а исключения в этих случаях приводят к написанию весьма громоздкого кода. Лично у меня, самый характерный случай, подталкивающий к использованию исключений -- критическая ошибка в конструкторе, когда объект, в полном соотвествии с RAII философией, не должен быть сконструирован (на практике, почти всегда такие конструкторы делаются private и объекты конструируются исключительно на куче с помощью статического метода).
She is exceptional...
Совсем другое дело сишный код -- тут ошибки надо обрабатывать буквально через строчку. То места в "контейнере" (читай -- массиве фиксированного размера) для вставки нового элемента не хватает, то выделение памяти из пула зафейлилось, то буфер для копирования строки недостаточный по размеру... Обрабатывать все это реально утомляет, а если все эти отказы еще и нужно поднять хотя бы на пару уровней вверх по дереву вызова, то ловишь себя на том, что 70% времени уходит не на полезный код, а на код, обрабатывающий бесчисленные отказы.
Я нашел очень простое решение такого рода проблем -- все ошибки летят исключениями и просто перехватываются в верхней точке, которая делает вызов в сишный мир.
Выглядит все это несколько парадоксально -- исключения оказываются намного более востребованными при работе с языком, в котором их нет...
No comments:
Post a Comment