Обратные вызовы в C++ | страница 86
6.2.2. Обработка ошибок
В процессе работы любой программы могут ситуации, приводящие к ошибкам. Причины ошибок могут быть самыми различными: неправильные действия пользователя, некорректная работа ПО, сбои в работе оборудования и т. п. Таким образом, возникает необходимость реализации подсистемы обработки ошибок, которая осуществляет восстановление работоспособности компонента после возникновения ошибочной ситуации и уведомление об этом пользователя.
В общем случае существуют две модели обработки ошибок: анализ кодов возврата и использование исключений. Несмотря на то, что использование исключений в последнее время подвергается серьезной критике, вплоть до того, что в новых языках программирования от них избавляются, в C++ указанный механизм остается востребованным, и мы также им воспользуемся. Объявления для формирования исключений представлены в Листинг 87.
>namespace sensor
>{
>enum class SensorError: uint32_t // (1)
>{
> NoError = 0,
> NotInitialized = 1,
> UnknownSensorType = 2,
> UnknownSensorNumber = 3,
> SensorIsNotOperable = 4,
> DriverIsNotSet = 5,
> InvalidArgument = 6,
> NotSupportedOperation = 7,
> InitDriverError = 8
>};
>class sensor_exception : public std::exception // (2)
>{
>public:
> sensor_exception(SensorError error);
> SensorError code() const;
> virtual const char* what() const;
> static void throw_exception(SensorError error); // (3)
>private:
> SensorError code_;
>};
>}; //namespace sensor
В строке 1 объявлены коды возможных ошибок, в строке 2 объявлен класс исключений. Если при выполнении где-то в коде возникает ошибка, то в этом месте нужно вызвать метод, объявленный в строке 3. Указанный метод выбросит исключение с соответствующим кодом.
6.2.3. Драйвер
Драйвер предназначен для взаимодействия с аппаратным обеспечением. Класс, представляющий обобщенный интерфейс для работы с драйвером, приведен в Листинг 88.
>namespace sensor
>{
>class IDriver
>{
>public:
> virtual void initialize() = 0; // (1)
> virtual void activate(SensorNumber number) = 0; // (2)
> virtual bool isOperable(SensorNumber number) = 0; // (3)
> virtual SensorValue readSpot(SensorNumber number) = 0; // (4)
> virtual SensorValue readSmooth(SensorNumber number) = 0; // (5)
> virtual SensorValue readDerivative(SensorNumber number) = 0; // (6)
> virtual ~IDriver() = default;