09 December 2016

Про Си и исключения

По работе писал некоторое количество плюсового кода вокруг сишной библиотеки и обратил внимание вот на какую забавную вещь.
Исключения.
В плюсах их используешь не так уж и часто -- чаще всего ошибку нужно обрабатывать по месту вызова, а исключения в этих случаях приводят к написанию весьма громоздкого кода. Лично у меня, самый характерный случай, подталкивающий к использованию исключений -- критическая ошибка в конструкторе, когда объект, в полном соотвествии с RAII философией, не должен быть сконструирован (на практике, почти всегда такие конструкторы делаются private и объекты конструируются исключительно на куче с помощью статического метода). 

She is exceptional...

Совсем другое дело сишный код -- тут ошибки надо обрабатывать буквально через строчку. То места в "контейнере" (читай -- массиве фиксированного размера) для вставки нового элемента не хватает, то выделение памяти из пула зафейлилось, то буфер для копирования строки недостаточный по размеру... Обрабатывать все это реально утомляет, а если все эти отказы еще и нужно поднять хотя бы на пару уровней вверх по дереву вызова, то ловишь себя на том, что 70% времени уходит не на полезный код, а на код, обрабатывающий бесчисленные отказы. 
Я нашел очень простое решение такого рода проблем -- все ошибки летят исключениями и просто перехватываются в верхней точке, которая делает вызов в сишный мир. 
Выглядит все это несколько парадоксально -- исключения оказываются намного более востребованными при работе с языком, в котором их нет... 





No comments:

Post a Comment