gpt4 book ai didi

c++ - 用模板定义异常是个好主意吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:12 26 4
gpt4 key购买 nike

我在想用模板定义异常是个好主意。定义不同类型的异常是一项 super 冗长的任务。你必须继承异常,没有任何改变,只是继承。像这样..

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

谢谢。维克多·林。

最佳答案

这是一个有趣的想法,但除了已经指出的缺点之外,它还不允许您定义异常层次结构:假设您要定义

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

那么 TemplatedException 将不会继承自 TemplatedException ,您的异常处理机制最终可能会比“普通”机制更笨拙。

关于c++ - 用模板定义异常是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/461918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com