Ist die Verwendung von exit() irgendwie riskant?



  • Mir passiert es manchmal bei längeren Prozeduren, dass ich im Code-Wirrwarr
    den Überblick verliere, und dann schreib' ich meistens exit(0), eigentlich
    aus der Verlegenheit heraus. Auch sonst, wenn ich mir keine Möglichkeit sehe,
    den Fehler von innerhalb des Programms zur Laufzeit zu korrigieren (weil
    z.B. eine externe API- oder .dll- Funktion mein Programm bestreikt), erscheint
    mir exit(0) die optimale Möglichkeit, das Programm zu beenden.
    Habe aber erst vor kurzem im Selbststudium Programmieren gelernt, und neulich
    hat mich ein Bekannter, der sich besser auskennt, darauf
    hingewiesen, dass es schlechter Stil sei, wenn ich das Programm aus heiterem
    Himmel mit exit() beende!
    Das wird schon so richtig sein, nur meine Frage, weil ich's trotzdem
    nicht lassen kann: Kann ich mit exit(0)
    versehentlich auch das System oder gar den Computer ruinieren, oder, falls
    nicht, welche Probleme könnten denn sonst noch auftreten, wenn man exit(0)
    verwendet? Ich empfand exit() nämlich bisher als eine extrem praktische
    Funktion und viel einfach zu bedienen, als umständlich irgendwelche Fehlercodes
    durch eine tiefe Funktions-Auftrufs-Hierarchie bis nach main() zurück zu
    geben, wo dann erst wieder nichts anderes gemacht wird, als dass das
    Programm beendet werden muss.
    Thx wenn sich wer mit exit() und eventuellen Risiken auskennt (womöglich
    sind die Risiken von exit() gar nicht so schlimm, wie mein Bekannter meint !?)


  • Mod

    Es ist schlechter Stil, da es Spaghetticode begünstigt. Man muss nun dein gesamtes Programm durchsehen, wo die ganzen exits verteilt sind, wenn man den Programmfluss nachvollziehen möchte.

    Ansonsten ist exit (im Gegensatz zu abort) die "sanfte" Methode, das Programm zu beenden. In C passiert an sich nichts schlimmes. Die Streams werden geflusht, tempfiles werden gelöscht und die atexit-Funktionen werden aufgerufen. Alles so wie bei einem normalem Verlassen der main-Funktion.

    (In C++ gilt dies nicht, da exit die automatischen Variablen nicht aufräumt. Das ist in C nicht so wichtig, aber in C++ meistens schon. Daher scheißt man in C++ meistens eine Exception, die erst in der main (oder auch gar nicht) gefangen wird, um den gleichen Effekt wie exit aber mit vollständigem Aufräumen zu erzielen.)



  • SeppJ schrieb:

    Daher scheißt man in C++ meistens eine Exception

    😃 👍



  • Exitus0 schrieb:

    Auch sonst, wenn ich mir keine Möglichkeit sehe,
    den Fehler von innerhalb des Programms zur Laufzeit zu korrigieren (weil
    z.B. eine externe API- oder .dll- Funktion mein Programm bestreikt), erscheint
    mir exit(0) die optimale Möglichkeit, das Programm zu beenden.

    Warum denn mit Exitstatus 0 beenden? Das signalisiert in den allermeisten mir bekannten Umgebungen die erfolgreiche Ausführung deines Programms. Wenn du aber aufgrund eines Fehlers dein Programm abbricht, wäre es doch sinnvoll, es den Benutzer/Administrator des Systems (oder dessen zu diesem Zweck eingerichteten Werkzeuge) wisssn zu lassen. Die einfachste Möglichkeit dafür, ist es, einen Exitcode ungleich 0 an die Laufzeitumgebung zurückzugeben.

    Da es auch einige Systeme gibt, bei denen 0 nicht unbedingt als Erfolg zu deuten ist (z.B. OpenVMS), sieht C hierfür auch entsprechende Makros vor: EXIT_SUCCESS und EXIT_FAILURE. Ersteres wird auf einem Unix- oder Windows-System als 0 definiert sein. Du willst in deinem Fall aber wahrscheinlich EXIT_FAILURE (auf meinem System ist das 1).


Log in to reply