请原谅我的C ++天真
我正在考虑创建从std :: stringstream继承的Exception类,以便我可以使用stringstream的运算符<<构建文本错误消息,同时能够尝试按类型捕获异常。
我的代码就像
class ExceptionXYZ : public std::stringstream
{};
Void someFunction()
{
try
{
//do something
}
catch(const ExceptionXYZ& e)
{
//handle XYZ
}
不幸的是我的VS2008编译器不喜欢这个并抱怨
错误C2248:'std :: basic_ios< _Elem,_Traits> :: basic_ios':不能 访问类中声明的私有成员 '的std :: basic_ios< _Elem,_Traits>'
basic_ios是一个伟大的祖父母(或其左右)的字符串流,并且某处必须有一些隐式访问冲突,但在我极其生锈的C ++和编译器的无用错误消息之间(它没有告诉我它担心的私人成员)我有点失落。
我想人们总是这样做(即抛出必须按类型捕获的文本的异常)。
非常感谢帮助
答案 0 :(得分:1)
您不应该继承流类只是为了在构造期间使用它们。如果您确实需要构建错误消息,您可能会选择存储根据请求构建它所需的信息,或者在构建时构建它。
从它的声音中你想要做这样的事情:
throw ExceptionXYZ() << "some " << information << " or " << other;
无论如何,这都不会太好用,因为operator<<()
都会返回std::ostream&
而不是你想要的异常对象。
答案 1 :(得分:0)
要向您的例外发送消息,您可以执行以下操作:
class ExceptionXYZ
{
public:
ExceptionXYZ(const std::string& msg) : msg_(msg) {}
const std::string& get_message() const { return msg_; }
private:
std::string msg_;
};
std::stringstream ss;
ss << "Error " << 42;
throw ExceptionXYZ(ss.str());
答案 2 :(得分:0)
您不能将std::stringstream
用作异常的基类,因为您无法复制或移动stringstream
(因为如果您查看错误消息,可能会在streambuffer
内部)这是抛出一个对象的要求。所以当我做这种代码时它无法编译:
class ExceptionXYZ : public std::stringstream {};
void test_except() throw (ExceptionXYZ)
{
ExceptionXYZ xyz;
xyz << "This exception is useless";
throw xyz;
}