boost :: lexical_cast到std :: string何时会失败?

时间:2019-05-01 11:30:42

标签: c++ boost lexical-cast

我正在编写单元测试,并试图覆盖所有代码。

我的代码中有如下内容:

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();
    }
}

我正在阅读these docs,找不到有关boost::lexical_caststd::string何时可以引发异常的任何信息。

您能帮我吗?

如果不可能,我将直接删除该try-catch。如果可能的话,我宁愿在单元测试中进行介绍。

3 个答案:

答案 0 :(得分:10)

除了用户定义的类型外,我想不出任何将词法转换为字符串以抛出bad_lexical_cast的原因。如果ValueType流插入运算符可以在流上设置错误标志,那么将导致bad_lexical_cast。否则,不会。

就算您只是转换catch之类的内置函数,我个人也会保留int;如果您以某种方式更改lexical_cast,或者您和我都没有考虑过某些极端情况,它不会造成伤害,并且可能会捕获错误;如果您不处理产生的异常,则会在运行时中止操作!

如果您担心异常的开销,则可以改用try_lexical_cast并检查它是否返回true而不是捕获。但是,如果ValueType流插入运算符可以抛出该异常,那么仍然仍然需要捕获该异常。

答案 1 :(得分:7)

例如,如果发生用户定义转换时,它可能会失败:

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甚至是不够的。您的单元测试必须捕获所有异常。

Live Demo

答案 2 :(得分:1)

唯一安全且永不过时的(例如,在更新之后没有令人讨厌的惊喜)是用类似以下的东西(难看)破坏代码:

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%的代码覆盖率!