[英]When does boost::lexical_cast to std::string fail?
我正在編寫單元測試並嘗試覆蓋所有代碼。
我的代碼中有這樣的東西:
template<typename ValueType>
std::string ConvertToStringUsingBoost(ValueType const& v)
{
try
{
return boost::lexical_cast<std::string, ValueType>(v);
}
catch(boost::bad_lexical_cast const& e)
{
LOG_ERR("Fail to cast %s to string", e.source_type().name);
return std::string();
}
}
我正在閱讀這些文檔 ,但無法找到有關何時boost::lexical_cast
到std::string
可以拋出異常的任何信息。
你能幫幫我嗎?
如果不可能,我會簡單地刪除這個try-catch。 如果可能的話,我寧願在單元測試中介紹它。
除了使用用戶定義的類型之外,我無法想到將詞匯bad_lexical_cast
為字符串以拋出bad_lexical_cast
的任何原因。 如果ValueType
流插入運算符可以在流上設置錯誤標志,那么這將導致bad_lexical_cast
。 否則,不是。
個人而言,我會保持catch
的,即使你只是轉換內置插件一樣int
S; 如果你以某種方式改變lexical_cast
,或者如果你和我都沒有考慮過一些邊緣情況,那么它不會受到傷害,也可能會發現錯誤; 如果你沒有處理結果異常,你將在運行時中止!
如果您擔心異常的開銷,可以使用try_lexical_cast
並檢查它是否返回true
而不是捕獲。 但是,如果ValueType
流插入操作符可以拋出,那么您仍然需要能夠捕獲該異常。
例如,如果用戶定義的轉換拋出,它可能會失敗:
enum class MyType {};
std::ostream& operator<<( std::ostream&, MyType const& )
{
throw "error";
}
int main()
{
try
{
boost::lexical_cast< std::string >( MyType{} );
}
catch(...)
{
std::cout << "lexical_cast exception";
}
}
由於您無法控制用戶定義的轉換引發的異常類型,因此捕獲boost::bad_lexical_cast
甚至都不夠。 您的單元測試必須捕獲所有異常。
唯一安全和未來的保護 (例如,在更新boost之后沒有令人討厭的意外)是用這樣的東西(丑陋)損害你的代碼:
template<typename ValueType>
std::string ConvertToStringUsingBoost(ValueType const& v)
{
try
{
#ifdef UNITTEST
if (unittest == case_fail) {
throw boost::bad_lexical_cast();
}
#endif
return boost::lexical_cast<std::string, ValueType>(v);
}
catch(boost::bad_lexical_cast const& e)
{
LOG_ERR("Fail to cast %s to string", e.source_type().name);
return std::string();
}
}
現在你應該可以達到~100%的代碼覆蓋率!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.