我通常只是创建自己的异常类。您只需要覆盖what()
并且可以提供任意数量的构造函数。要构建错误消息,只需使用 vasprintf(如果可用)或 std::ostringstream 就像上面一样。
这是一个例子:
class CustomException : public std::exception {
private:
const std::string message;
public:
CustomException(const std::string &format, ...) {
va_list args;
va_start(args, format);
char *formatted = 0;
int len = vasprintf(&formatted, format.c_str(), args);
if (len != -1) {
message = std::string(formatted);
free(formatted);
} else {
message = format;
}
va_end(args);
}
const char *what() const {
return message.c_str();
}
};
如果你没有 vasprintf,你也可以在堆栈上使用带有缓冲区的 vsnprintf...