Die Verwendung exit()
ist in Ordnung
Zwei Hauptaspekte des Code-Designs, die noch nicht erwähnt wurden, sind "Threading" und "Bibliotheken".
In einem Single-Thread-Programm ist die Verwendung in dem Code, den Sie zur Implementierung dieses Programms schreiben, in exit()
Ordnung. Meine Programme verwenden es routinemäßig, wenn etwas schief gelaufen ist und der Code nicht wiederhergestellt werden kann.
Aber…
Das Anrufen exit()
ist jedoch eine einseitige Aktion, die nicht rückgängig gemacht werden kann. Aus diesem Grund erfordern sowohl "Threading" als auch "Bibliotheken" sorgfältige Überlegungen.
Threaded-Programme
Wenn ein Programm über mehrere Threads verfügt, ist die Verwendung exit()
eine dramatische Aktion, bei der alle Threads beendet werden. Es wird wahrscheinlich unangemessen sein, das gesamte Programm zu beenden. Es kann angebracht sein, den Thread zu beenden und einen Fehler zu melden. Wenn Sie mit dem Design des Programms vertraut sind, ist dieser einseitige Ausstieg möglicherweise zulässig, aber im Allgemeinen nicht akzeptabel.
Bibliothekscode
Und diese Klausel „Kenntnis des Programmdesigns“ gilt auch für Code in Bibliotheken. Es ist sehr selten richtig, eine Allzweckbibliotheksfunktion aufzurufen exit()
. Sie wären zu Recht verärgert, wenn eine der Standardfunktionen der C-Bibliothek nur aufgrund eines Fehlers nicht zurückgegeben werden könnte. (Offensichtlich Funktionen wie exit()
, _Exit()
, quick_exit()
, abort()
soll nicht auf Rückkehr, das anders ist.) Die Funktionen in der C - Bibliothek daher entweder „nicht versagen“ oder eine Fehleranzeige zurückzukehren irgendwie. Wenn Sie Code schreiben, um in eine Allzweckbibliothek zu gelangen, müssen Sie die Fehlerbehandlungsstrategie für Ihren Code sorgfältig abwägen. Es sollte zu den Fehlerbehandlungsstrategien der Programme passen, mit denen es verwendet werden soll, oder die Fehlerbehandlung kann konfigurierbar gemacht werden.
Ich habe eine Reihe von Bibliotheksfunktionen (in einem Paket mit Header "stderr.h"
, einem Namen, der auf dünnem Eis steht), die beendet werden sollen, wenn sie für die Fehlerberichterstattung verwendet werden. Diese Funktionen werden standardmäßig beendet. Es gibt eine verwandte Reihe von Funktionen im selben Paket, die Fehler melden und nicht beendet werden. Die vorhandenen Funktionen werden natürlich in Bezug auf die nicht vorhandenen Funktionen implementiert, aber das ist ein internes Implementierungsdetail.
Ich habe viele andere Bibliotheksfunktionen, und viele von ihnen verlassen sich auf den "stderr.h"
Code für die Fehlerberichterstattung. Das ist eine Designentscheidung, die ich getroffen habe und mit der ich einverstanden bin. Wenn die Fehler jedoch mit den Funktionen gemeldet werden, die beendet werden, wird der allgemeine Nutzen des Bibliothekscodes eingeschränkt. Wenn der Code die Fehlerberichtsfunktionen aufruft, die nicht beendet werden, müssen die Hauptcodepfade in der Funktion Fehlerrückgaben ordnungsgemäß behandeln - erkennen Sie sie und leiten Sie eine Fehleranzeige an den aufrufenden Code weiter.
Der Code für mein Fehlerberichtspaket ist in meinem SOQ- Repository (Stack Overflow Questions) auf GitHub als Dateien stderr.c
und stderr.h
im Unterverzeichnis src / libsoq verfügbar .