Обратные вызовы в C++ | страница 86



6.2.2. Обработка ошибок

В процессе работы любой программы могут ситуации, приводящие к ошибкам. Причины ошибок могут быть самыми различными: неправильные действия пользователя, некорректная работа ПО, сбои в работе оборудования и т. п. Таким образом, возникает необходимость реализации подсистемы обработки ошибок, которая осуществляет восстановление работоспособности компонента после возникновения ошибочной ситуации и уведомление об этом пользователя.

В общем случае существуют две модели обработки ошибок: анализ кодов возврата и использование исключений. Несмотря на то, что использование исключений в последнее время подвергается серьезной критике, вплоть до того, что в новых языках программирования от них избавляются, в C++ указанный механизм остается востребованным, и мы также им воспользуемся. Объявления для формирования исключений представлены в Листинг 87.

Листинг 87. Исключения для обработки ошибок (Errors.h)

>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.

Листинг 88. Интерфейс для работы с драйвером (DriverInterface.h)

>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;