如果系统调用失败,我想抛出一个包含与失败相关的'errno'的异常。现在,我用这个:
if (bind(...) == -1) {
std::stringstream s;
s << "Error:" << errno << " during bind";
throw std::runtime_error(s.str());
}
这看起来很笨拙。我不能直接将一个整数附加到std :: string() - 这是什么最好的解决方案? Java有String()。append(int),但std :: string中没有这样的工具。为此,每个人都围绕std :: string写一个包装器吗?
答案 0 :(得分:3)
boost::lexical_cast
非常有用:
throw std::runtime_error("Error:" + boost::lexical_cast<std::string>(errno) + " during bind");
答案 1 :(得分:3)
我喜欢使用boost::format
。
std::string msg = boost::str( boost::format("Error: %1% during bind") % errno );
throw std::runtime_error(msg);
有一点需要注意的是,如果catch块中有bad_alloc
,则可能会隐藏上一个错误。据我所知,boost::format
使用分配,因此可能会受此影响。你没有赶上这里,所以它并不完全适用。但是,通过错误处理可以了解这一点。
答案 2 :(得分:2)
你可以写自己的:
以下是一些提示:
class Exception{
public:
Exception(const char* sourceFile, const char* sourceFunction, int sourceLine, Type type, const char* info = 0, ...);
protected:
const char *mSourceFile;
const char *mSourceFunction;
int mSourceLine;
Type mType;
char mInfo[2048];
};
类型可以是:
enum Type
{
UNSPECIFIED_ERROR, //! Error cause unspecified.
.. other types of error...
};
所以你可以用通常的格式传递字符串..例如
Exception(__FILE__, __FUNCTION__, __LINE__, Type::UNSPECIFIED_ERROR, "Error %d", myInt);