Свой класс исключений
#include "state.h"
#include <iostream>
class Error : public std::runtime_error {
public:
Error(const char *msg, State state);
State GetState() const;
private:
State state_;
};
#include "../include/error.h"
using namespace std;
Error::Error(const char *msg, State state) : std::runtime_error(msg), state_(state){
}
State Error::GetState() const {
return state_;
}
Всем привет! Хочу написать свой класс исключений со своими кодами ошибок. Если посмотреть на встроенные исключения в C++, то как я понял есть базовый класс std::exception от которого наследуются другие классы исключений, например runtime_error и т.д. В своем классе, я также планирую делать наследование от runtime_error, потому-что у него есть конструктор принимающий char *.
Стоит ли мне также делать много классов исключений для разных ошибок, или же у меня появилась идея что в моем классе исключений будет поле ENUM, в котором будут коды ошибок, и тогда мне не придется делать много разных класссов. Получится, что ошибки группируются в одном месте (тип enum) и нет необходимости создавать иерархии исключений, чтобы различать разные типы ошибок. Или это бред?
Ответы (1 шт):
Сам класс написан правильно. Нужен только второй конструктор с параметром const std::string & вместо const char *, чтобы было по канону (в runtime_error сделано так же).
Если вы храните строку с ошибкой, то наследоваться напрямую от std::exception не стоит. Потому что std::runtime_error и прочие хранят ее не в лоб, а грамотно (в некотором подобии shared_ptr, чтобы копирование никогда не бросало исключения). Лучше наследоваться от runtime_error, и хранить строку в нем.
Стоит ли мне также делать много классов исключений для разных ошибок
Имхо, кастомные классы исключений вообще не нужны в 99% случаев, потому что в 99% случаев исключения либо не ловят, либо ловят одним большим try в main, печатают, и роняют программу. Либо ловят, чтобы дописать что-то в строку и кинуть дальше.
Поэтому используйте std::runtime_error и все.
Когда вам потребуется ловить исключения в другом месте и как-то по-особому обрабатывать их разные типы, тогда уже выбирать между enum-ом или множеством классов.