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

标签 c++ templates exception inheritance stringstream

请原谅我的 C++ 幼稚

我正在考虑创建将从 std::stringstream 继承的异常类,以便我可以使用 stringstream 的运算符 << 构建文本错误消息,同时能够尝试按类型捕获异常。

我的代码是这样的

class ExceptionXYZ : public std::stringstream
{};

Void someFunction()
{
   try
   {
      //do something
   }
   catch(const ExceptionXYZ& e)
   {
      //handle XYZ
   }

不幸的是我的 VS2008 编译器不喜欢这个并提示

error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'

basic_ios 是 stringstream 的曾祖 parent (或左右),某处肯定存在一些隐式访问冲突,但在我极其生锈的 C++ 和编译器无用的错误消息之间(它没有告诉我它担心的私有(private)成员)我有点迷路了。

我想人们一直在做这种事情(即抛出必须按类型捕获的文本异常)。

帮助将不胜感激

最佳答案

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

听起来你想做这样的事情:

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

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

关于c++ - 在 C++ 中创建从 io 类继承的异常类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20829695/

相关文章:

c++ - std::sort 是否也针对少量项目进行了优化?

c++ - C++ 的嵌套循环

C++指针问题

c++ - 这个 std::decay 的实现是正确的吗

C#:是否应该捕获所有异常

c++ - 什么时候不需要 .h 来包含头文件?

C++ 结构模板特化

templates - template.ParseGlob() 可以解析子目录中的模板吗?

java - JasperReport异常打印

android - 在edittext中没有输入任何内容时如何避免异常?