Можно ли хранить информацию об ошибке в объекте Exception? - PullRequest
6 голосов
/ 20 апреля 2020

Я читал об исключениях в C ++, о плюсах и минусах, и мне еще никому не приходилось упоминать о двух вещах, которые мне действительно нравятся в них: они позволяют мне расширить определение ошибки (до того, что это больше, чем просто сообщение об ошибке в виде строки), и они позволяют мне определить контракт между обработчиком исключений и метателем:

"Если я собираюсь обработать этот конкретный тип ошибка, мне понадобится это, то и это от вас. "

Я не видел это упомянутое ни в одной из статей, форумов и постов блога, как про или довод И это заставило меня заподозрить, что моё мышление об исключениях и способах их использования может быть неправильным.

Чтобы пояснить, вот пример моего использования исключений:

Программа связывается с USB-устройство (отправляет команды устройству и ожидает от него определенного ответа). Это USB-устройство может иногда вести себя неожиданным образом при ответе на команду. В этом случае программа выдаст исключение UnexpectedResponseFromDevice. Для выполнения своей работы обработчику этого исключения требуется нечто большее, чем просто сообщение об ошибке. Например, может потребоваться информация о команде, которую мы отправляли на устройство, когда произошла ошибка, и / или состояние, в котором находилось устройство. Я использую определение класса UnexpectedResponseFromDevice, чтобы явно указать, что требуется обработать исключение. См. Примерную идею ниже.

class UnexpectedResponseFromDevice : public std::exception
{
private:
    Command command;
    DeviceState deviceState;
    std::string msg;

public:
    UnexpectedResponseFromDevice(std::string msg, Command command, DeviceState deviceState, ...)
    Command getCommand();
    DeviceState getDeviceState();
};

Это то, что я имел в виду под «определением контракта между обработчиком исключений и метателем». Чтобы вызвать исключение, необходимо предоставить эти вещи (в данном случае Command, DeviceState и сообщение).

Является ли это приемлемым вариантом использования исключений? Можно ли мне хранить эту другую информацию, необходимую для обработки исключения, в объекте исключения? Это приемлемо, но плохая идея? Если да, объясните, пожалуйста, почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...