2016-04-13 5 views
1

Ich führe Code, der eine boost:bad_lexical_cast werfen könnte, wenn ich eine Sequenz von Tokens werfe - aber ich kann nicht in den Code gehen und "die Token beiseite legen", damit ich herausfinden kann, was tatsächlich fehlgeschlagen ist.Wenn ich einen boost :: bad_lexical_cast erhalte, kann ich auf den String/das Token zugreifen, das umgewandelt werden soll?

Können Sie mit boost:bad_lexical_cast auf die Zeichenfolge zugreifen, die sie irgendwie versucht hat zu werfen? Ich konnte nichts in seiner Definition finden, abgesehen von einigen Feldern bezüglich Typnamen, aber vielleicht fehlt mir etwas.

+0

wenn Sie einen Code zeigen kann, würde ich zeige dir, wie ich es umgestalten würde, um dies noch lesbar zu machen. –

+0

@RichardHodges: 'try {foo(); } catch (boost :: bad_lexical_cast & e) {/ * Was ist hier zu tun? * /} ' – einpoklum

Antwort

0

wenn Sie die Kontrolle über den Code haben, der lexical_cast aufruft, dann können Sie mit Funktion versuchen Blöcke zu fangen, zu wickeln und wieder werfen die Ausnahme mit zusätzlichen Informationen:

#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(); 
} 
+0

Mit gebührendem Respekt - wenn ich Zugang zu' s' hätte, würde ich diese Frage nicht stellen ... der Punkt ist, dass ich keinen Zugang dazu habe. – einpoklum

+0

@einpoklum vergib mir, ich habe die Frage missverstanden. –

+1

Es gibt nichts zu vergeben, du hast versucht zu helfen. Obwohl das SO ist, was bedeutet, dass Sie mit negativem Feedback konfrontiert werden, schätze ich Menschen, die sich die Zeit nehmen, meine Fragen zu beantworten :-) – einpoklum