簡體   English   中英

什么時候boost :: lexical_cast到std :: string失敗了?

[英]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_caststd::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甚至都不夠。 您的單元測試必須捕獲所有異常。

現場演示

唯一安全和未來的保護 (例如,在更新之后沒有令人討厭的意外)是用這樣的東西(丑陋)損害你的代碼:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM