您好我正在尝试创建接收参数并将字符串发送到基类的新异常。
代码
class EmptyFunctionException : public std::runtime_error {
public:
EmptyFunctionException(std::string filename, std::string funcname){
std::stringstream ss;
ss << filename << " " << funcname;
std::runtime_error(ss.str());
}
};
错误
基类'runtime_error'没有默认构造函数。
我知道我需要像那样发送它
EmptyFunctionException(std::string filename, std::string funcname)
: std::runtime_error(...)
但是如何在此之前创建字符串?
感谢。
答案 0 :(得分:1)
我会这么做,不是实际在构造函数中设置基本异常的what()
消息,而是根据您的需要覆盖what()
方法:
class EmptyFunctionException : public std::runtime_error {
public:
EmptyFunctionException(const std::string filename&, const std::string& funcname
: std::runtime_error(""), filename_(filename), funcname_() {
std::stringstream ss;
ss << filename << " " << funcname;
msg_ = ss.str();
}
const char* what() const noexcept {
return msg_.c_str();
}
private:
std::string filename_;
std::string funcname_;
std::string msg_;
};
由于what()
在基础中被声明为virtual
,并且它是受所需基本异常参数影响的唯一方法,因此最好覆盖它。
虽然,我会考虑,具体EmptyFunctionException
的整个目的是什么?是否应该有一些特殊的逻辑来处理它超出runtime_error
,或者只是为了进行错误消息格式化?
在后一种情况下,可以在抛出异常之前完成。
答案 1 :(得分:0)
如果你真的需要复杂的格式化而且简单连接不行,你可以随时拥有一个中级类:
class EmptyFunctionException : public std::runtime_error {
struct ErrorFormatter {
ErrorFormatter(const std::string& filename, const std::string funcname)
{
std::stringstream ss;
ss << filename << " " << funcname;
errstr = ss.str();
}
const std::string& str() const { return errstr; }
private:
std::string errstr;
};
public:
EmptyFunctionException(std::string filename, std::string funcname) :
std::runtime_error(ErrorFormatter(filename, funcname).str()) {}
};