Objekte, die trotz geworfener und gefangener Exception nicht destruiert werden.



  • hallo,

    wie es im topic steht ist meine aufgabe eine eigene exceptionklasse zu schreiben. ich soll exceptions fangen und werfen, aber dabei sollen die objekte mit denen ich arbeite nicht destruiert werden was mich ein wenig verwirrt.

    hier ist mein code:

    class MyException : std::exception {
       public:   
          virtual const char* what() const throw() {
            return "eigene Ausnahme";
          }
    };
    
    class Obj {
       public:   
          Obj(char* c) {
            cout << "Obj " << c << " erzeugt" << endl;
          }
          ~Obj() {
            cout << "Obj tot" << endl;
          }         
    };     
    
    int test(int i) {
        if (i == 10)
          return 30/i;
        else
          throw MyException();
    } 
    
    int main() {
        try {
          Obj* p = new Obj("p");
          Obj* o = new Obj("o");
          Obj* m = new Obj("m");
          Obj* n = new Obj("n");
          cout << test(10) << endl;
          test(3);
        } catch (MyException& e) {
          cout << "Eine Exception ist aufgetreten: "  << e.what() << endl;
        }              
        system("pause");
        return 0;
    }
    

    ich muss das programm halt noch umschreiben, dass ich die methode mit den objekten aufrufe, aber im grunde genommen ist doch alles so richtig oder hab ich da was grunlegendes falsch verstanden? wenn ja, wie würdet ihr diese aufgabe lösen?

    vielen dank schonmal für die antworten!



  • Hi,

    wenn ich richtig verstanden habe, ist Dein Ziel, das die Obj-Objekte eine fliegende Exception überleben - richtig ?

    DANN ist das korrekt, wie Du das machst.
    Allerdings wäre Folgendes wohl einfacher (und auch "Speicherleck-sicherer"):

    int main() {
       Obj p("p");
       Obj o("o");
       Obj q("q");
       Obj r("r");
       try {
         cout << test(10) << endl;
         test(3);
       }
       catch (MyException& e) {
          cout << "Eine Exception ist aufgetreten: "  << e.what() << endl;
       }              
    // Hier existieren p, o, q, r noch...
    

    Das geht aber nicht mehr, wenn die Objekte erst innerhalb des try-Blocks erzeugt werden können....

    Gruß,

    Simon2.



  • Und direkt zum restlichen stil:

    class Obj {
       public:  
          Obj(char* c) {
            cout << "Obj " << c << " erzeugt" << endl;
          }
          ~Obj() {
            cout << "Obj tot" << endl;
          }        
    };    
    
    int test(int i) {
        if (i == 10)
          return 30/i;
        else
          throw MyException();
    }
    

    Hmm ... man sollte, wenn möglich, const setzen, und wenn Werte sich im Vorfeld berechnen lassen, dies auch gerne schonmal tun.

    class foo
    {
        std::ostream& m_out;
    
    public:
        foo(const char* name, std::ostream& out = std::cout)
            : m_out(out)
        { out << name << ".{ c-tor }"; }
        ~foo()
        { out << "{ d-tor }"; }
    };
    
    int test(int x)
    { 
        if (x != 10) throw MyException();
        return 3;
    }
    

    ...



  • (D)Evil schrieb:

    Und direkt zum restlichen stil:

    class foo
    {
        std::ostream& m_out;
    
    public:
        foo(const char* name, std::ostream& out = std::cout)
            : m_out(out)
        { out << name << ".{ c-tor }"; }
        ~foo()
        { out << "{ d-tor }"; }
    };
    
    int test(int x)
    { 
        if (x != 10) throw MyException();
        return 3;
    }
    

    ein bisschen überflüssig, hier. da wäre ich gleich von anfang an für ein sinnvolles MVC-modell. bringt dem OP nichts.

    ich bin mir allerdings auch gar nicht sicher, was der will.

    die aufgabenstellung hört sich ein bisschen so an wie: "kennen sie ``function-try-blöcke''?"



  • vielen dank für die antworten, ja die aufgabe war es die objekte am "leben" zu lassen. ich habe inzwischen auch herausgefunden, dass mein programm der lösung sehr nahe kommt.

    vielen dank nochmal an die antworter!!



  • venomicious schrieb:

    vielen dank für die antworten, ja die aufgabe war es die objekte am "leben" zu lassen. ich habe inzwischen auch herausgefunden, dass mein programm der lösung sehr nahe kommt.

    vielen dank nochmal an die antworter!!

    das problem ist: nach dem werfen der exception "existieren" deine objekte zwar noch, allerdings nur in anführungszeichen: es gibt keine möglichkeit mehr, auf sie zuzugreifen (und beispielsweise ihren speicher freizugeben -> memory leak)

    kannst du mal die originale aufgabenstellung (1 zu 1) posten?



  • Aufgabe 1:
    Schreiben Sie ein Programm, bei dem in einem Try Block Objekte angelegt
    werden, die trotz eines geworfenen und gefangenen Exception nicht destruiert
    werden.

    der prof meinte gerade, dass er selber nicht mehr genau weiß warum er diese aufgabe so gestellt hat, da die objekte ja so und so nicht destruiert werden (wenn sie mit new erzeugt wurden), wenn man nicht delete x; usw. aufruft.



  • Und wenn man sie ohne new erzeugt? (Davon steht in der Aufgabe nämlich nichts)

    Aber Profs, die nicht wissen was sie tun, kennen wir ja genug 😃



  • Hi venomicious,

    LordJaxom schrieb:

    Und wenn man sie ohne new erzeugt? (Davon steht in der Aufgabe nämlich nichts)...

    Siehe Dir dazu nochmal meinen Vorschlag oben an.

    Gruß,

    Simon2.


Anmelden zum Antworten