创建从C ++中的io类继承的异常类

时间:2013-12-29 20:23:35

标签: c++ templates exception inheritance stringstream

请原谅我的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 ++和编译器的无用错误消息之间(它没有告诉我它担心的私人成员)我有点失落。

我想人们总是这样做(即抛出必须按类型捕获的文本的异常)。

非常感谢帮助

3 个答案:

答案 0 :(得分:1)

您不应该继承流类只是为了在构造期间使用它们。如果您确实需要构建错误消息,您可能会选择存储根据请求构建它所需的信息,或者在构建时构建它。

从它的声音中你想要做这样的事情:

throw ExceptionXYZ() << "some " << information << " or " << other;

无论如何,这都不会太好用,因为operator<<()都会返回std::ostream&而不是你想要的异常对象。

答案 1 :(得分:0)

STD中的(大多数)类型被设计为不用作基类。仅将它们用作成员变量。

要向您的例外发送消息,您可以执行以下操作:

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;
}

http://ideone.com/NQUunh