automatisch exception werfen bei fehlercode
-
hallo leute
kennt jemand einen weg, wie ich automatisch eine exception werfen kann, wenn sich der inhalt einer variablen, die an eine funktion uebergeben wurde, aendert ?
kurz skizziert wie es funktionieren koennte, wenn es mir erlaubt waere aus einem detructor eine exception zu werfen:
class extern_error { public: extern_error(int &val) : m_value(val) { } ~extern_error(void) { if(m_value != 0) throw int(1); } operator int&(void) noexcept { return m_value; } private: int &m_value; }; /* class extern_error */ auto test(const char *str, int &result) -> void { if(str == nullptr) { result = 12; return; } std::cout << str << std::endl; } ... int ret = 0; try { test("testausgabe", extern_error(ret)); test("noch ein test", extern_error(ret)); test(nullptr, extern_error(ret)); } catch(int err) { ... }
die funktionen fuer die ich das haben will sind alle in DLL dateien.
da waere es praktisch wenn ich nicht nach jedem funktionsaufruf den fehlercode abfragen muesste.Meep Meep
-
auf Fehlerwert prüfen und mit einem guten weiterarbeiten sind doch zwei paar Stiefel - wird der Test nicht undurchsichtig bei solchen Spezialitäten?
-
Gast3 schrieb:
auf Fehlerwert prüfen und mit einem guten weiterarbeiten sind doch zwei paar Stiefel - wird der Test nicht undurchsichtig bei solchen Spezialitäten?
sry aber ich versteh die frage nicht. kannst mal bitte erklaeren/anders formulieren ?
-
Also du müsstetst deinem destructor noch sagen, dass er werfen darf, er ist sonst implizit noexcept.
~extern_error(void) noexcept(false) { ... }
Aber ob man unbedingt aus einem Destructor werfen will... Wenn test() sicher keine exception wirft, funktioniert das so. Ob das guter Stil ist, weiß ich nicht so recht.
-
danke wob, so funktioniert es.
wie schon geschrieben liegen die funktionen alle in einer DLL datei.
funktionen duerfen keine exceptions ueber dll-grenzen werfen. insofern ist das abgesichert. sind auch als noexcept deklariert. hab ich jetzt bei meiner testfunktion vergessen anzugeben.
die hilfsklasse die ich zum werfen erstelle, hat nur eine referenz auf einen int-wert als member. insofern kann da eigendlich nichts passieren, wenn ich aus dem destruktor eine exception werfe.theoretisch koennte der compiler sowas in der art generieren:
// pseudocode test("string", ret) if(ret != 0) throw(1)
die ueberlegung dabei ist, das ich ja nur eine referenz auf eine variable in der klasse speichere und meines erachtens hat eine referenz keinen destructor der aufgerufen werden koennte. damit sollte das eigendlich ok sein. oder hinkt meine logik ?
Meep Meep