是否存在与将数据流式传输到c ++异常类相关的危险?

时间:2018-01-20 00:55:12

标签: c++ exception

请考虑以下代码:

throw my_exception() << "The error " << error_code << " happened because of " << reasons;

支持代码如下:

class my_exception
{
   public:
      template <typename T>
      my_exception & operator << (const T & value)
      {
         // put the value somewhere
         return *this;
      }
      // etc.
};

与下面的替代方案相比,是否有任何理由会导致这种throw危险或效率低下?

std::stringstream s;
s << "The error " << error_code << " happened because of " << reasons;
throw my_exception(s.str());

1 个答案:

答案 0 :(得分:4)

您通过多个函数调用(operator<<重载)构造异常对象,所有这些都在抛出异常之前发生。这与正常的程序执行没什么不同。

唯一可能的问题是,如果异常对象构建中的某些内容抛出(例如,如果没有足够的内存可用于保存构建的错误字符串),则可以抛出不同的异常。

所以这样做没有任何本质上的危险。