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 Funktionstd::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 auflaufenbietet 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 auflaufenbietet 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