我想拋出一個異常,提供有關哪些輸入/結果導致問題的更詳細的信息。然後,我可以將有用的錯誤消息記錄到日誌中,同時捕獲這些異常。我正在處理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