Philipp Hasenfratz: exit in subroutine - kein guter programmierstil

Beitrag lesen

Halihallo Torsten

exit sollte sowieso nur in der Shell für die Interaktion mit anderen Programmen
verwendet werden, ansonsten ist "die" oder "croak" wohl sinnvoller, sodass man auch
weiss, woran das Programm gestorben ist.
Kannst du mir als Laien mal verständlich erklären, was es mit "croak" auf sich hat? Aus der perldoc bin ich nicht so recht schlau geworden.

use Carp;
croak 'test';

croak und cluck/carp haben dieselbe Funktion wie "die" bzw. "warn", nur, dass die und
warn die aktuelle Position im Programm ausgeben, wo der Fehler genau aufgetaucht ist,
wohingegen cluck/carp/... diejenigen Positionen des "caller" zurückgeben, der die
Funktion wo der Fehler auftritt aufgerufen hat.

Sollte eigentlich in allen Modulen zum Einsatz kommen, denn die Position innerhalb des
Moduls ist oftmals wirklich völlig irrelevant, viel wichtiger wäre es zu wissen, wo der
Fehler im _eigenen_ Programm auftaucht. Man geht hier davon aus, dass das verwendete
Modul "keine Fehler" hat und das der Programmierer im eigenen Programm etwas falsch
gemacht hat. Wichtig ist also alleine zu wissen, wo der Fehler im _eigenen_ Programm
entsteht und genau diese Position wird von croak/carp/cluck/... angegeben.

Worin liegen der Unterschied und der Vorteil in der sub test_it gegenüber der Variante, innerhalb der sub gleich exit(0) oder exit(1) auszuführen? Bestehen da Bedenken hinsichtlich des Programmierstils oder hinsichtlich der Ausführung des Scriptes oder beides oder was ganz anderes?

Es ist einfach unschön, das Programm in einer Schleife oder Prozedur zu beenden. Eine
Prozedur ist eine "atomare" Verarbeitungsvorschrift und Atome soll man bekanntlich nicht
spalten (exit zwischen drin), sonst fliegt einem das Haus um den Kopf :-)
Der Aufbau des Programmes ist einfach schön hierarchisch aufgebaut und dies íst schönes
Programmieren. Man könnte dies mit dem "goto"-Paradigma vergleichen: Das Umherspringen
wird heute als schlechter Programmierstil gewertet, da der Programmfluss einfach sehr
schwer nachzuvollziehen ist. Ähnlich ist es mit exit in Prozeduren.
Oder anders: Eine Prozedur oder besser: eine Funktion gibt einen Wert zurück. Nach einer
Funktion soll entweder weitergearbeitet werden, oder nicht (exit). Aber: Diese
Entscheidung darf nicht bei der Funktion selber liegen, sondern vom äusseren
Programmkontext. Ein anderes Programm braucht vielleicht dieselbe Funktion und will
bei einem Fehler weiterarbeiten, ein exit wäre hier in der Funktion fatal. Wann ein
Programm beendet wird ist von der Aufgabenstellung abhängig, nicht von einer Funktion.
Demnach soll das Hauptprogramm entscheiden, wann schluss ist.

Viele Grüsse

Philipp

--
RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.