Когда я ловлю 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();
}