[英]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.