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





Это определенно возможно и работает нормально, но я бы этого избегал. Это скрывает диагностику. GCC отобразит имя типа исключения, включая обычные элементы шаблона. Я бы лично определил новый класс исключений за несколько минут. Не то чтобы ты делал это все время.
Если вы ленивы и не хотите писать, что нужно для объявления нового класса исключения, вы всегда можете использовать макрос, который сделает это за вас.
Это интересная идея, но помимо уже отмеченных недостатков, она также не позволит вам определить иерархию исключений: предположим, что вы хотите определить
class InvalidArgumentException {};
class NullPointerException : public InvalidArgumentException {};
тогда TemplatedException <NullPointerException> не будет унаследовано от TemplatedException <InvalidArgumentException>, и ваш механизм обработки исключений может оказаться более неуклюжим, чем "простой".