Exception fangen und nachricht weiterleiten
-
Hallo!
Ich hab ien kleines problem. Für meine Exceptions benutze ich std::runtime_error wenn was schief läuft. Ich benutze ticpp (tinyxml), die schmeißt ticpp::Exeption
Ich möchte in etwa das hier realisieren:try { m_CmnDataDir = "CmnData/"; // Folgende können ticpp::Exdpetion schmeißen, damit kann ich hier aber nichts anfangen // Ich möchte sie weiterleiten an die zentrale Exceptionverwaltung wo die Meldung ausgegeben wird. LoadXmlSetting("AmphIdent.xml"); LoadXmlSetting("KM.xml"); std::string t = GetOptionString("KM.xml", "set1/set1-1/val1-1-1"); } catch (ticpp::Exception& e) { // throw in catch geht ja nciht ... throw std::runtime_error(e.m_details.c_str()); }Wie kann man das am elegantesten lösen? Ich möchte nicht in der zentralen Behandlungsroutine einen extra catch-block einrichtign für ticpp, weil ich das ja nur in einem ganz bestimmten Bereich benutze.
Ich muss also quasi die NAchricht, die ticpp::Exeption enthält in std::runtime_error umwandeln
-
wenn du mit verschachtelten try blöcken leben kannst einfach so:
#include <iostream> #include <stdexcept> #include <string> int main() { try { try { throw std::string("ticpp exception"); } catch(std::string& s) { throw(std::runtime_error(s)); } } catch(std::runtime_error& re) { std::cout<<re.what()<<std::endl; } return 0; }
-
ne das geht ja nciht. In einem catchblock darf doch meines wissens nicht was neues geworfen werden, oder?
ALso mein prog schmeirt dabei jedenfalls immer ab. das einzige was geht ist throw; da wird es einfach weitergeworfen.Viel schlimmer wird es ja ncoh hierbei:
Ich habe ein plugin, welches einen datenbankzugriff abstrahiert. Verschiedene plugins benutzen verschiedene libs und alle schmeißen verschiedene Exceptions. Wie mach ich das nu runter, dass die NAchricht als std::runtime_error oder was abgeleitetes ankommt?Das ginge, ist aber extrem hässlich...
bool fehler = false; string msg; try { //... } catch(ticpp::Exception& e) { msg = e.m_details; fehler = true; } if(fehler) throw std::rumtime_error(msg);Aber so will ichs echt nich machen, das is ja total hässlich und zerschießt meinen ganzen schönen code
-
Klar darfst du etwas neues weiterwerfen, wer soll dich denn daran hindern? (vielleicht wäre es gut dazuzusagen, WIE und WO dein Programm "abschmiert")
-
Maxi schrieb:
ne das geht ja nciht. In einem catchblock darf doch meines wissens nicht was neues geworfen werden, oder?
ALso mein prog schmeirt dabei jedenfalls immer ab. das einzige was geht ist throw; da wird es einfach weitergeworfen.wenn da ein throw stehn darf warum dann nicht auch throw std::runtime_error? also bei mir klappts wunderbar! kannst ja der übersichtlichkeit halber den inneren try-block in eine funktion auslagern, die dann auch alle dateien läd. beim throw-spezifizierer nur std::runtime_error angeben und die funktion dann nur noch im try block von main() aufrufen.
-
hm...
Also es kommt mir komisch vor, im catch-blcok einer exception eine andere zu werfen. Das Weiterleiten is ja da was anderes würd ich sagen.Also Abschmieren is vl komisch gesagt. Im VC sagt er mir dann wenn ich zu throw std::runtime_error im catch-block komme, und weiter gehen will, das zu der stelle kein source code gefunden werden kann. mit F5 beendet er sich dann normal irgendwie. Hm.. also bis jetzt scheints ja doch zu funktionieren.
Aber ich war mir doch so sicher, dass man im catch block nichts neues schmeißen darf. Aber das ist wirklich nicht so?
-
Mag ja sein das es nach deinem pers. Empfinden komisch ist, in einem catch-Block eine neue Exception zu werfen. Aber wen interessiert das?
Solange es allgemein legal und als sauberes Design angesehen wird, spricht nichts dagegen. Außer vielleicht dein pers. Empfinden. Aber dann solltest du uns hier auch nicht nach unserer Meinung fragen, wenn du es eh angeblich besser weißt. Oder?
-
ja, ich hab das eben auch garnich richtig probiert obs geht, weils eben nicht geht (dachte ich)...
Naja, nun weiß ich es besser. Ich hab ja auch nur gesagt, dass esmir komishc vorkommt, aber daran gewöhn ich mich, jetzt wo ich weiß, dass es so klappt