Я читал об исключениях в 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 и сообщение).
Является ли это приемлемым вариантом использования исключений? Можно ли мне хранить эту другую информацию, необходимую для обработки исключения, в объекте исключения? Это приемлемо, но плохая идея? Если да, объясните, пожалуйста, почему.