2016-04-21 15 views
5

Im folgenden Code möchte ich die what() Nachricht einer Boost :: Ausnahme erhalten.Erhalte die what() Nachricht von boost :: exception

#include <iostream> 
#include <boost/lexical_cast.hpp> 
#include <boost/exception/diagnostic_information.hpp> 

int main(void) 
{ 
    try 
    { 
     int i(boost::lexical_cast<int>("42X")); 
    } 
    catch (boost::exception const &e) 
    { 
     std::cout << "Exception: " << boost::diagnostic_information_what(e) << "\n"; 
    } 
    return 0; 
} 

Wenn ich es laufen lasse, erhalte ich die Meldung:

Exception: Throw location unknown (consider using BOOST_THROW_EXCEPTION) 
Dynamic exception type: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_lexical_cast> > 

Aber wenn ich nicht die Ausnahme abfangen, die Shell-Ausgänge:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_lexical_cast> >' 
    what(): bad lexical cast: source type value could not be interpreted as target 
[1] 8744 abort  ./a.out 

Ich möchte diese Nachricht: bad lexical cast: source type value could not be interpreted as target ; aber ich konnte nicht den Weg finden, es zu haben. Das Boost-Exception-System ist mir ein Rätsel.

Wie bekomme ich diese Botschaft?

Bearbeiten: boost :: Ausnahme hat keine what() Methode. Also, wie kann die Shell schreiben std::exception::what: bad lexical cast: source type value could not be interpreted as target, da dies kein std::exception ist?

+0

anzeigen kann ich nicht ein starkes Argument finden mit boost ::Ausnahme. Ist es zu spät, um den Standard zu machen? http://en.cppreference.com/w/cpp/error/throw_with_nested –

Antwort

4

fangen sie als bad_lexical_cast die Methode verwenden what():

catch (const boost::bad_lexical_cast& e) 
{  // ^^^^^^^^^^^^^^^^^^^^^^^ 
    std::cout << "Exception: " << e.what() << "\n"; 
           // ^^^^^^^^ 
} 

Und es wird seit dem Aufkommen von C++ 11 der verschachtelten Ausnahmen Exception: bad lexical cast: source type value could not be interpreted as target

+2

Vielen Dank. Wie ist es möglich, dass die Basisklasse keine rein virtuelle Methode 'what()' enthält? Warum so eine Wahl? – Boiethios

+0

erbt er 'what()' von 'std :: bad_cast', wie er [hier] (http://www.boost.org/doc/libs/1_40_0/libs/conversion/lexical_cast.htm#bad_lexical_cas) gesehen wird erbt von ['std :: exception'] (http://en.cppreference.com/w/cpp/types/bad_cast) –

+0

Es ist seltsam. Ich vermutete, dass jede Ausnahme von Boost von der einzigen 'boost :: exception 'wie' std :: exception' abgeleitet wird. – Boiethios

4

Von the diagnostic_information_what reference:

Die diagnostic_information_what Funktion soll von einem benutzerdefinierten std :: exception aufgerufen werden :: was (Override).

Die Funktion soll nicht die Meldung von der what() Funktion geben, es sollte in die what() Funktion verwendet werden, um eine Nachricht zu erstellen zurückzukehren.

Dann fortzusetzen, von the boost::lexical_cast reference:

Wenn die Umwandlung nicht erfolgreich ist, eine bad_lexical_cast Ausnahme ausgelöst.

lässt So werfen Sie einen Blick die bad_lexical_cast:

class bad_lexical_cast : public std::bad_cast 

Aus dem Standardstd::bad_cast erbt, die von std::exception erbt, die eine what() Memberfunktion haben.

So ist die Lösung zu fangen boost::bad_lexical_cast (oder std::exception) anstelle von boost::exception, die überhaupt nicht beteiligt ist.

Verwandte Themen