C++ C++;带有printf样式字符串的异常类?

C++ C++;带有printf样式字符串的异常类?,c++,c++11,C++,C++11,在C++11中,是否有一种简单(甚至更好的内置)的方法可以在异常中执行类似于printf样式的字符串 throw std::runtime_error( "Failed to open '%s' [%d]: %s", filename, errno, strerror(errno) ); 我知道我可以snprintf到一个'char[],然后将结果传递到一个异常构造函数中,或者首先转换为std::string 只是想知道C++11是否提供了更好/更简单的功能。自从C++11

在C++11中,是否有一种简单(甚至更好的内置)的方法可以在异常中执行类似于printf样式的字符串

throw std::runtime_error( "Failed to open '%s' [%d]: %s", 
         filename, errno, strerror(errno) );
我知道我可以
snprintf
到一个'char[],然后将结果传递到一个异常构造函数中,或者首先转换为std::string


只是想知道C++11是否提供了更好/更简单的功能。

自从C++11以来,您可以从
std::string
构造异常:

std::runtime_error("Failed to open " + std::string(filename) + std::to_string(errno));

这有一个轻微的缺点,
std::string
的构造函数可能会
抛出
,从而终止程序。但是,这应该只在处理某种“内存不足”异常时才起作用。

如果您只是在谈论创建格式化字符串,您可以将串联与


不,C++中没有任何其他东西可以做这个,也没有任何标准要求它使它成为可选的。你可能需要Booo::格式(或)更简单的东西。很容易用VSNPrTNF实现你自己的,但是使用起来很危险。异常中的格式错误或溢出将是一件可怕的事情。抛出异常不总是分配内存吗?@BrianMcFarland即使它是静态分配的,您也需要一些空间,因为您总是抛出异常的副本。这通常不需要任何堆分配,而且
std::string
可能非常大。但在现实世界的代码中,我从来没有遇到过这个问题,只是为了得到一个完整的答案才提到这个。好吧,我认为在我的例子中,这是一个可以接受的风险,但要记住这一点。使用
+
进行串联是我对简单字符串的第一个想法,但我不知道
到字符串
,我认为
ostringstream
会很尴尬。
throw std::runtime_error(std::string("Failed to open ") + filename +  "[" + std::to_string(errno) + "]: " + strerror(errno));