我想抛出一个异常,提供有关哪些输入/结果导致问题的更详细的信息。然后,我可以将有用的错误消息记录到日志中,同时捕获这些异常。我正在处理VS2012,它没有实现参数包。所以目前我使用vsprintf将可变长度参数合并到字符串中。在异常构造函数中参数化错误消息是否是一种好的做法?
它是一个很好的做法,使用这种
printf-like
功能在错误处理阶段?或者它只是不需要在异常中携带这些细节信息?
异常
class VargException : std::exception
{public:
VargException (const char* fmt, ...)
{
va_list vargs;
va_start(vargs, fmt);
char buf[260] = {};
vsprintf_s(buf, fmt, args);
va_end(vargs);
msgBuilt_ = tryAssign(msg_, buf);
}
const char* what() const {
return msgBuilt_? msg_.c_str(): "Error message failed to build";
}
std::string msg_;
bool msgBuilt_;
// Updated: Avoid dynamic std::string throw exception
bool tryAssign(std::string& msg, const char* buf) throw()
{
try{ msg = buf; return true;}
catch (...) { return false; }
}
};
客户端代码
void func(int key, int len) {
try {
if(notExists(key)) { throw VargException("%d key does not exist", key); }
if(outOfRange(len)) { throw VargException("length %d is out of range.", len); }
HRESULT hr = processSomething();
if(FAILED(hr)) { throw VargException("FAILED to processingSomething. hr: 0x%08X", hr); }
} catch (VargException& e) {
std::cerr << e.what() << "\n";
}
}
@BaummitAugen'std :: exception'实际上没有。 'logic_error'和'runtime_error'。 –
可以说'vsprintf'不是类型安全的。 – Jason