Sofort beenden?



  • Wie beendet ihr euer Programm aus einer x-belibigen Funktion heraus???

    ich mach immer so was:

    funktion () { class x {}; throw x(); }
    


  • throw NULL; wäre klüger



  • In welcher Bibliothek findet man "throw"?



  • in gar keiner, das ist eingebaut.



  • du hast dich soeben trollen lassen :p



  • nö, aber wenn ich auf dich antworten würde ...

    ups 😃



  • Meine Frage war eigentlich ernst gemeint. :o

    Welche Methoden gibt es, um ein Stack-Unwinding herbeizuführen und das Programm zu beenden - auf jedenfall, egal wo?
    exit kümmert sich ja nicht um lokale Objekte, oder?



  • Ich würde throw 1; machen. Dann kannst du das in der main catchen und returnen --> Unterscheidung zwischen guter und schlechter Terminierung möglich.



  • ich wollte eigentlich so machen, dass es nirgendwo gecatcht werden kann. und ich glaube mal irgendwo gelesen zu haben, das lokale klassen überhaupt nicht, also auch nicht vom ... gecatcht werden. das kommt mir allerdings etwas selstam vor, deshalb gfrage ich hier nochmal.
    und wenn nicht, wie ich sonst das programm (sicher) terminieren kann, ohne dass main etwas mitzureden hat.

    außerdem;: sollte man statt throw 1; nicht lieber ne eigene fehlerklasse werfen?



  • Original erstellt von <Ende>:
    **ich wollte eigentlich so machen, dass es nirgendwo gecatcht werden kann. und ich glaube mal irgendwo gelesen zu haben, das lokale klassen überhaupt nicht, also auch nicht vom ... gecatcht werden. das kommt mir allerdings etwas selstam vor, deshalb gfrage ich hier nochmal.
    und wenn nicht, wie ich sonst das programm (sicher) terminieren kann, ohne dass main etwas mitzureden hat.

    außerdem;: sollte man statt throw 1; nicht lieber ne eigene fehlerklasse werfen?**

    naja... du musst halt einfach definieren, dass catch (...) verboten ist und catch (int) der main vorbehalten ist. und die main muss per definition nach dem muster sein:

    int main() {
      try {
        // bla
      } catch (int i) {
        return i;
      }
    }
    

    wo liegt das problem?



  • ich wollte eigentlich so machen, dass es nirgendwo gecatcht werden kann. und ich glaube mal irgendwo gelesen zu haben, das lokale klassen überhaupt nicht, also auch nicht vom ... gecatcht werden.

    Nicht ganz. Ein catch(...) fängt *jede* C++ Exceptions. Du kannst in einem solchen Handler aber nicht auf das Exception-Objekt zugreifen. Du kannst also außerhalb einer Funktion die eine lokale Klasse definiert, keine Exception von dieser Klasse fangen.

    Das ändert aber nichts daran, dass ein catch(...)-Handler auch solche Exceptions behandelt.



  • Original erstellt von <Ende>:
    **Wie beendet ihr euer Programm aus einer x-belibigen Funktion heraus???

    ich mach immer so was:

    funktion () { class x {}; throw x(); }
    

    **

    Eigentlich garnicht. Man wirft eine Exception. An geeigneter Stelle sollte diese gefangen werden um richtig Aufräumen zu können. Wenn Du eine Funktion / Methode schreibst sollte es eigentlich auch egal sein wer wie mit der Exception umgeht da die Funktion garnicht weiß wie der rest des Programmes darauf reagieren soll. Also einfach einen passenden Fehler werfen. Der Aufrufer muß dann entsprechend die Arbeit leisten.

    Auch wenn der Stack aufgerollt wird und die Objekte zerstört werden, resourceleaks kann es noch zu genüge geben.



  • hm mir ist eine idee gekommen:

    void end_the_program () {
    
        class ExtremeError {
        public:
            ~ExtremeError () { throw 0; }
        };
    
        throw ExtremeError ();
    }
    
    #include <iostream>
    int main () {
       try {
          end_the_program ();
       } catch(...) {}
    
       std::cout << "Programm wurde erfolgreich ausgeführt\n";
    }
    

    Dann muss man nur noch im Destruktor wenn nötig den terminate handler außer gefecht setzen 🙂



  • Hallo,
    was du da machst ist großer Käse. Insbesondere werden hier keine lokalen Objekte zerstört. Eine Exception wird by-value geworfen. Hier wird also eine Kopie des Exception-Objekts erzeugt. Diese wird im Zuge des Stack-Unwindings zerstört. Der Dtor wirft eine weitere Exception die selbigen verlässt -> terminate() -> Ende aus und vorbei.

    Da gibt es deutlich einfachere Alternativen zu. Z.B.

    assert(false);
    

    Entweder der Fehler ist derart kritisch, dass überhaupt kein sinnvolles Verhalten mehr möglich ist, dann beende das Programm und mach dir keinen Kopf um lokale Objekte.
    Oder, falls noch sinnvolles Handeln möglich ist, wirf eine Exception und überlasse es dem aufrufenden Code diese zu behandeln.

    [ Dieser Beitrag wurde am 07.06.2003 um 18:33 Uhr von HumeSikkins editiert. ]



  • Ich weiß, dass ich momentan in meiner "alles, was ich sage ist großer Käse"-Fase bin, aber ist sowas in der Richtung nicht ganz ok.

    class Exit_program {};
    
    voif foo () 
    {
       ...
       if (...)   
          throw Exit_program();
       ...
    }
    
    int main()
    {
       try {
          foo();
       }
       catch(Exit_program & bar)
       {
       }
    }
    


  • ähm ja. käse-phase...

    der code soll das programm auf jedenfall beenden. nix mit fangen. aus. ende. programmabsturz.
    also wenn es nun wirklich nicht möglich ist, die lokalen objekte alle sicher zu zerstören, dann ist assert(false); sicher das beste...



  • Ist die Funktion main abgelufen, so wird das Programm beendet. Da mein catch die letzte Anweisung ist, die in der Funktion main steht, wird nach dem Werfen eines Exit_program das Programm beendet. Und eine sichere Zerstörung der Objekte sollte auch kein Problem sein.



  • wenn ich aber keinen zugriff auf main hab bzw. ich nicht der entwickler davon bin geht das nicht.



  • dann mach doch

    class Exit_program {};
    
    voif foo () 
    {
       ...
       if (...)   
          throw Exit_program();
       ...
    }
    
    void bar ()
    {
       try {
          foo();
       }
       catch(Exit_program & quer)
       {
       }
       catch(...) 
       {
          throw;
       }
       exit(0);
    }
    

    Wobei bar die Funktion ist, die die anderen aufrufen dürfen und foo ist deine private Funktion.

    [ Dieser Beitrag wurde am 08.06.2003 um 13:34 Uhr von Helium editiert. ]



  • oder ein assert(false)


Anmelden zum Antworten