Когда я ловлю boost::bad_lexical_cast, могу ли я получить доступ к строке / токену, который должен был быть приведен?

Я бегу код, который может бросить boost:bad_lexical_cast при приведении последовательности токенов - но я не могу зайти в код и "отложить токены в сторону", чтобы понять, что на самом деле провалилось.

Есть ли boost:bad_lexical_cast позволить вам получить доступ к той строке, которую он пытался как-то разыграть? Я не могу найти ничего в его определении, за исключением некоторых полей, касающихся имен типов, но, возможно, что-то мне не хватает.

1 ответ

Если у вас есть контроль над кодом, который вызывает 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();
}
Другие вопросы по тегам