繁体   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