Это хорошая идея - определять исключение с помощью шаблона?

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

class FooException : public BaseException {
public:
    ...
};

class BarException : public BaseException {
public:
    ...
};

...

Кошмар, не правда ли? Поэтому я рассматриваю возможность определить другое исключение с помощью шаблона

/**
    @brief Exception of radio
**/
class Exception : public runtime_error {
private:
    /// Name of file that throw
    const string m_FileName;

    /// Line number of file that throw
    size_t m_Line;
public:
    Exception(const string &what, const string &File, size_t Line)
throw()
        : runtime_error(what),
        m_FileName(File),
        m_Line(Line)
    {}

    virtual ~Exception() throw() {}

    /**
        @brief Get name of file that throw
        @return Name of file that throw
    **/
    virtual const string getFileName() const throw() {
        return m_FileName;
    }

    /**
        @brief Get throw exception line
        @return Throw exception line
    **/
    virtual size_t getLine() const throw() {
        return m_Line;
    }

    /**
        @brief Get description of this exception
        @return Description of this exception
    **/
    virtual const string getMessage() const throw() {
        return what();
    }

    virtual void print(ostream &stream = cerr) const throw() {
        stream << "# RunTimeError #" << endl;
        stream << "Error : " << what() << endl;
        stream << "File : " << getFileName() << endl;
        stream << "Line : " << getLine() << endl;
    }
};


/**
    @brief Template exception of radio
**/
template <typename T>
class TemplateException : public Exception {
public:
    TemplateException (const string &what, const string &File, size_t
Line) throw()
        : Exception(what, File, Line)
    {}

    virtual ~TemplateException () throw() {}
};

}

#define THROW(type, error) (throw TemplateRadioException<type>(
(error), __FILE__, __LINE__))

Поэтому, если мне нужно определить новое исключение, я могу просто определить такой пустой класс.

class NuclearException {};

Чтобы выбросить исключение

THROW(NuclearException , "Boom!!");

Ловить

try {

} catch (TemplateException<NuclearException> &e) {
    // ...
}

Если мы хотим перехватить все исключения, мы можем написать это

try {

} catch (Exception &e) {
   // ...
}

Он работает нормально, но я не уверен, есть ли побочные эффекты? Это хорошая идея - определить другой тип исключения? Или есть решение получше? Понятия не имею: S

Спасибо. Виктор Линь.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
5 950
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

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

Это интересная идея, но помимо уже отмеченных недостатков, она также не позволит вам определить иерархию исключений: предположим, что вы хотите определить

class InvalidArgumentException {};
class NullPointerException : public InvalidArgumentException {};

тогда TemplatedException <NullPointerException> не будет унаследовано от TemplatedException <InvalidArgumentException>, и ваш механизм обработки исключений может оказаться более неуклюжим, чем "простой".

Другие вопросы по теме