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

Gri*_*eev 9 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在阅读这些文档,但没有找到何时的任何信息boost::lexical_cast,以std::string能够抛出异常。

你能帮我吗?

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

Lig*_*ica 10

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

就个人而言catch,即使您只是在转换诸如ints之类的内置函数,我也愿意这么做。如果您lexical_cast以某种方式进行更改,或者如果您和我都没有考虑过某些极端情况,它不会造成伤害,并且可能会捕获错误。如果您不处理产生的异常,则会在运行时中止!

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

  • 每当我出门时,我总是得到“ bad_weather_cast”。 (3认同)

zet*_*t42 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

由于您无法控制用户定义的转换引发的异常类型,因此捕获boost::bad_lexical_cast甚至是不够的。您的单元测试必须捕获所有异常。

现场演示

  • 嗯,我读到的问题是关于bad_lexical_cast的,但是这很不错 (2认同)