Error handling
E.14
Используйте специально разработанные определённые пользователем типы как исключения (не встроенные типы)
Причина
Определённый пользователем тип может лучше передать информацию об ошибке обработчику. Информация может быть закодирована в самом типе, и тип маловероятно, что столкнётся с исключениями других людей.
Пример
throw 7; // плохо
throw "something bad"; // плохо
throw std::exception{}; // плохо - нет информации
Деривация от std::exception дает гибкость ловить конкретное исключение или обрабатывать в целом через std::exception:
class MyException : public std::runtime_error
{
public:
MyException(const string& msg) : std::runtime_error{msg} {}
// ...
};
// ...
throw MyException{"something bad"}; // хорошо
Исключения не нужно выводить из std::exception:
class MyCustomError final {}; // не выведено из std::exception
// ...
throw MyCustomError{}; // хорошо - обработчики должны ловить этот тип (или ...)
Типы библиотеки, выведенные из std::exception, могут использоваться как универсальные исключения, если полезную информацию нельзя добавить в точке обнаружения:
throw std::runtime_error("something bad"); // хорошо
// ...
throw std::invalid_argument("i is not even"); // хорошо
Классы enum также допускаются:
enum class alert {RED, YELLOW, GREEN};
throw alert::RED; // хорошо
Применение
Ловите throw встроенных типов и std::exception.