捕获boost :: bad_lexical_cast时,是否可以访问要转换的字符串/标记?

时间:2016-04-13 14:31:39

标签: c++ boost exception-handling lexical-cast

我运行的代码在投出一系列令牌时可能会抛出boost:bad_lexical_cast - 但我无法进入代码并且#34;将代币放在一边"所以我可以弄清楚实际失败了什么。

boost:bad_lexical_cast是否允许您访问它试图以某种方式投射的字符串?除了关于类型名称的一些字段外,我似乎无法在其定义中找到任何内容,但可能还有我缺少的东西。

1 个答案:

答案 0 :(得分:0)

如果您控制了调用lexical_cast的代码,那么您可以使用函数try块来捕获,包装并重新抛出具有额外信息的异常:

#include <boost/lexical_cast.hpp>
#include <string>
#include <stdexcept>
#include <exception>

struct conversion_error : std::runtime_error
{
  conversion_error(const std::string& name, const std::string& value)
    : std::runtime_error::runtime_error("converting " + name + " : " + value)
    , name(name)
    , value(value)
    {}

    const std::string name, value;
};

struct test
{

  void bar()
  {
    try { 
      foo(); 
    } catch(const conversion_error& e) { 
      std::cerr << e.what() << std::endl;
    }
  }

  void foo()
  try
  {
    i = boost::lexical_cast<int>(s);
  }
  catch(...)
  {
    std::throw_with_nested(conversion_error("s", s));
  }

  std::string s;
  int i;
};

int main()
{
  test a { "y", 0 };
  a.bar();
}