Boost 1.60. Asio error_code-enum zu std::string?



  • ich gebe bei boost errors gerne den enum-Namen + message aus
    bisher machen ich das mit einer grossen if/switch Funktion

    std::string boost_error_error_code_enum_str(const boost::system::error_code& p_error)
      {
        //basic_errors
        if(p_error == boost::asio::error::access_denied) return "boost::asio::error::access_denied";
        if(p_error == boost::asio::error::address_family_not_supported) return "boost::asio::error::address_family_not_supported";
        //....
        return "unknown boost error";
      }
    

    und nutze das dann so

    printf("chat_client.cpp handle_connect error-enum: %s, error-message: %s", boost_error_error_code_enum_str(error).c_str(), error.message().c_str());  //  hier landen wir wenn der server nicht connectierbar ist
    

    gibt es einen einfacheren Weg an den enum-Namen zu kommen
    mir reicht auch "access_denied" usw. - ich mache das einfach gerne um sehr schnell einen Ueberblick zu bekommen welche spezifischen Fehler so auflaufen

    bietet da Boost/Asio etwas in der Art an?



  • Gast3 schrieb:

    bietet da Boost/Asio etwas in der Art an?

    Keine Ahnung.

    Wenn es die Library nicht bereits unterstützt, bzw. wenn ich die Library selbst schreibe, ist das ein Fall wo ich Makros verwende:

    std::string FooToString(Foo foo)
    	{
    #define FOOLIB_FOOTOSTRING_CASE(name) \
    	case name: return BOOST_PP_STRINGIZE(name);
    
    		switch (foo)
    		{
    		FOOLIB_FOOTOSTRING_CASE(Foo_Blub)
    		FOOLIB_FOOTOSTRING_CASE(Foo_Blah)
    		FOOLIB_FOOTOSTRING_CASE(Foo_Dingsen)
    
    		default:
    			assert(0 && "invalid Foo value");
    			return str(boost::format("Foo %1%") % static_cast<int>(foo));
    		}
    
    #undef FOOLIB_FOOTOSTRING_CASE
    	}
    

    Makros FTW 🙂



  • Ich bin mir ziemlich sicher, dass du nicht an den enum namen oder wenigstens den system error namen kommst (bsp: EABORT).

    Ich hätte den Kram irgendwann einfach kopiert und es (evtl ähnlich - da gibts mehrere Alternativen) wie hustbär gemacht.



  • Gast3 schrieb:

    .. und nutze das dann so

    printf("chat_client.cpp handle_connect error-enum: %s, error-message: %s", boost_error_error_code_enum_str(error).c_str(), error.message().c_str());  //  hier landen wir wenn der server nicht connectierbar ist
    

    gibt es einen einfacheren Weg an den enum-Namen zu kommen
    mir reicht auch "access_denied" usw. - ich mache das einfach gerne um sehr schnell einen Ueberblick zu bekommen welche spezifischen Fehler so auflaufen

    bietet da Boost/Asio etwas in der Art an?

    Ja - die Lösung steht doch schon in Deinem Code. Die Methode ' std::string error_code::message() ' liefert den Fehlertext. Die Implementierung greift auf die Windows-Funktion FormatMessage zurück. Oder habe ich Deine Frage nicht verstanden?
    Der Text ist aber abhängig von der eingestellten Sprache.

    Edit: FormatMessage wird natürlich nur unter Windows gerufen; bei anderen Betriebssystemen gibt es aber ähnliches. Eine Posix-Implementierung existiert meines Erachten 'eingebaut'.

    Gruß
    Werner



  • Oder habe ich Deine Frage nicht verstanden?

    ja das hast du

    ich gebe bei boost errors gerne den enum-Namen + message aus

    if(p_error == boost::asio::error::access_denied) return "boost::asio::error::access_denied";
    

    gibt es einen einfacheren Weg an den enum-Namen zu kommen


Anmelden zum Antworten