![]() |
AW: Verständnisfrage zu Exit
Zitat:
Ich verstehe die Frage bzw. das Problem nicht. In C und seinen Derivaten werden mit return der Rückgabewert festgelegt und die Funktion verlassen. In Pasal, Delphi und seinen Derivaten gibt es dafür zwei getrennte Befehle. Der Funktionswert kann innerhalb der Funktion sogar beliebig oft geändert werden. Er sollte aber bei jedem Funktionsdurchlauf wenigstens einmal einen Wert zugewiesen bekommen, ansonsten ist der Rückgabewert unbestimmt. |
AW: Verständnisfrage zu Exit
Auch wenn das Thema so ziemlich abgehandelt ist, interessiert mich doch noch ein Aspekt.
Ich arbeite im Moment an einer EXIF-Unit. Die Exiferei ist ein Gebiet, auf dem man alles, wirklich alles pausenlos abprüfen muss, weil dort das reine Faustrecht herrscht (ja, Microsoft und Adobe, ihr seid gemeint!). Dementsprechend ist ein Result ausschließlich am Ende völlig illusorisch, weil es nur noch boolesche Funktionen gibt und die voll sind von Results. Dementsprechend wäre für die Funktionen Folgendes sinnvoll:
Delphi-Quellcode:
Vor allem auch für das Debuggen ist das enorm praktisch, weil man sich durchF8en kann und sofort sieht, wenn Result False wird. Und sehr übersichtlich ist es auch, was ja für Code nicht das Schlechteste ist. Andererseits sieht man sowas im Proficode nie, woraus ich schließe, dass es aus mir unerfindlichen Gründen verpönt ist (Himitsu, lass das "h" weg, das kommt von poena!). Mein Gedanke ist nun: Der Compiler lässt das alles doch sowieso nicht so, wie wir das hinschreiben. Es kann doch oft sein, dass die "offziellen" Elaborate überhaupt kein anderes Ergebnis erbringen als der Code oben, und schon mal überhaupt keinen Geschwindigkeitsunterschied. Ist es nicht erwägenswert, übersichtlichen und debuggingfreundlichen Code zu schreiben, der dann sowieso vom Compiler optimiert wird?
Result := KlapptDas1;
Result := Result and KlapptDas2; Result := Result and KlapptDas3; Result := Result and KlapptDas4; If Result then begin ... // jetzt kann es losgehen |
AW: Verständnisfrage zu Exit
Zitat:
Zitat:
Angewandt auf Dein Beispiel: Debugging-freundlicher Code ist guter Code, es sei denn, er ist nachweisbar ein Performance-Problem. |
AW: Verständnisfrage zu Exit
Zitat:
Und, wenn ich auch kein Freund vom Exit bin, hier kann bei mir dann durchaus mal sowas vorkommen:
Delphi-Quellcode:
Das entspricht dem weiter oben mehrfach Angesprochenen:
Result := KlapptDas1;
Result := Result and KlapptDas2; Result := Result and KlapptDas3; Result := Result and KlapptDas4; If not Result then exit; // weil hier einfach ggfls. noch "furchtbarviel" Code folgen kann. Am Anfang werden die Grundvoraussetzungen geprüft, sind die nicht erfüllt, dann raus per Exit. Danach kommt dann die Erledigung der eigentlichen Aufgabe. |
AW: Verständnisfrage zu Exit
Zitat:
Delphi-Quellcode:
Breakpoint auf alle Exit und du springst sofort auf den betreffenden Exit ohne mit F8 durch zappen zu müssen.
if not KlapptDas1 then
Exit; if not KlapptDas2 then Exit; if not KlapptDas3 then Exit; if not KlapptDas4 then Exit; ... // jetzt kann es losgehen Immer wenn ich irgendwo beim Refactoring bin, versuche ich immer Vorabbedingunge in ein Exit hineinzuverfrachten. |
AW: Verständnisfrage zu Exit
Zitat:
Zitat:
Vor Kurzem hat Himitsu sein
Delphi-Quellcode:
gepostet und da habe ich mich gefragt, warum ich nicht selbst darauf gekommen bin.
If Bedingung = Erfüllt then
Sleep(0) Ansonsten - OK, da bin ich ja beruhigt.:thumb: |
AW: Verständnisfrage zu Exit
Zitat:
|
AW: Verständnisfrage zu Exit
Zitat:
Delphi-Quellcode:
if not KlapptDas1 then
Exit(False); if not KlapptDas2 then Exit(False); if not KlapptDas3 then Exit(False); if not KlapptDas4 then Exit(False); ... // jetzt kann es losgehen |
AW: Verständnisfrage zu Exit
Zitat:
|
AW: Verständnisfrage zu Exit
Spielverderber! Trotzdem guter Tipp für mich: Das
Delphi-Quellcode:
ist die Regel und notfalls schreibe ich es hin, auch wenn am Anfang der Routine
exit(False)
Delphi-Quellcode:
steht. Kann man ja wieder wegmachen, wenn das Debugging vorbei ist.
Result := False;
|
AW: Verständnisfrage zu Exit
Zitat:
Dann verhält sich dein Programm ja beim Debuggen womöglich anders, als in echt, was schon ein bissl sinnlos wäre. Und natürlich geht es nur, wenn es eine Funktion und keine Prozedur ist. Und natürlich auch nur mit Boolean als Result. :stupid: |
AW: Verständnisfrage zu Exit
Nein, ich meinte doch Folgendes:
Delphi-Quellcode:
Das "False" wäre ja nicht nötig, kann man zum Debuggen rein und hinterher wieder rausmachen.
Function LeseJPGEin(DatnameMV:string):Boolean;
begin Result := False; If not DateiVorhanden then exit(False); If not HeaderOK then exit(False); If not EndianOK then exit(False): .... (Oder man geht nach Hagen und macht das "Result := False" erst gar nicht hin, aber ich bin da gern auf der sicheren Seite.) |
AW: Verständnisfrage zu Exit
Zitat:
Das
Delphi-Quellcode:
kann man nach hinten verschieben.
Result := False;
Delphi-Quellcode:
Grade dein Procedurename/Funktionsname ist für ein Result geeignet. Laden des Jpeg hat funktioniert oder eben nicht.
Function LeseJPGEin(DatnameMV:string):Boolean;
begin If not DateiVorhanden then exit(False); If not HeaderOK then exit(False); If not EndianOK then exit(False): Result := True; .... |
AW: Verständnisfrage zu Exit
Zitat:
|
AW: Verständnisfrage zu Exit
Weil das Exit(False) sonst knallt?
Und ja, diese Exit sind hier schon bissl blöd. Es ist toll, wenn die Prozedur nicht nur Exit macht, sondern wenigstens noch Funktion noch ein False sagt, aber erstmal wird oft genug vergessen das Result von Funktionen auszuwerten und dann macht es die Fehlerbehandung und auch Fehlersuche extrem spannend, wenn man nicht weiß warum die Funktion nichts machte. Exceptions sind schon was Tolles, das auch gute Infos geben könnte. |
AW: Verständnisfrage zu Exit
Zitat:
![]() Bzw. Im Regelfall nimmt man das Result einer Funktion und hängt einfach eine Operation an den Erfolg an. Allso ein automatisches
Delphi-Quellcode:
Dürfte in Delphi aber kniffelig umzusetzen sein, weil es als varianter record immer den Zugriff auf den Erfolg zulässt und/oder (als Klassenhierarchie) den Aufrufer mit der Speicherfreigabe "beglückt".
res := strtoint(text)
if res.Success then Result := TResult.Create(Success, res.Value * 2) else Result := res |
AW: Verständnisfrage zu Exit
Zitat:
Delphi-Quellcode:
übergeben wird.
var
Erstens kann man dadurch mehr als einen Wert übergeben, und zweitens finde ich den Aufruf
Delphi-Quellcode:
viel praktischer als
If BestimmeHeaderPos(HeaderPos) then begin
MachWasMitHeaderPos;
Delphi-Quellcode:
HeaderPos := BestimmeHeaderPos;
If HeaderPos > 0 then begin MachWasMitHeaderPos; |
AW: Verständnisfrage zu Exit
Zitat:
Aber ich find grade nicht. |
AW: Verständnisfrage zu Exit
Zitat:
Zitat:
|
AW: Verständnisfrage zu Exit
Zitat:
Ich hab über diese Thematik übrigens auch schon gebloggt: ![]() ![]() Kommt jetzt aber arg vom Thema "Exit oder nicht" ab ;) |
AW: Verständnisfrage zu Exit
Zitat:
Denn wenn der Kunde anruft und sich beschwert, dass die JPEG-Datei xyz.jpg nicht geladen werden kann, will ich wissen wie es dazu kam: War die Datei vorhanden? War der Header Okay? War das Endian Okay? Zumal diese Funktion eh Exceptions werfen könnte, z.B. weil der Dateipfad falsch ist, die Datei gesperrt ist, das Netzlaufwerk zum Pfad nicht gemountet ist. Und auch weil die Datei nicht vorhanden ist, weil DateiVorhanden eine RaceCondition darstellt. Wenn es Interessante Gründe gibt warum eine Methode Fehlschlägt sollte man diese nicht hinter einem Boolean Result verstecken. Davon sollte nur abgewichen werden, wenn jemand "beweist", dass das für die Anwendung ein Performance-Problem darstellt. Dann könnte ich mich evtl. mit der hässlichen alternative
Delphi-Quellcode:
anfreunden.
function LeseJPGEin(DatnameMV:string; var FehlerMeldung: string):Boolean;
Ciao HeZa |
AW: Verständnisfrage zu Exit
Zitat:
![]() Zitat:
|
AW: Verständnisfrage zu Exit
Zitat:
|
AW: Verständnisfrage zu Exit
Zitat:
Eleganter finde ich ein Functionsresult. Muss ja nicht unbedingt ein boolean sein, sondern kann auch eine Fehlernummer oder ein Enum sein. Exceptions verwende ich in der regel nur, wenn das Programm einen undefinierten Status bekommen könnte, oder wenn Eingabeparameter einen Wert haben, der eigentlich nicht vorkommen darf, dann hat die aufrufende Procedure schon einen Fehler gemacht. |
AW: Verständnisfrage zu Exit
Die Beispiele hier sind ja normal nicht der "Normalfall", also ist es kein Problem da mit einer Exception zu reagieren.
Exceptions haben auch den Vorteil, dass sie entweder "automatisch" angezeigt werden oder man sie außerhalb und sogar viel weiter oben via Try-Except abfangen/behandeln kann. Und ja, es gibt auch andere Wege, wo man zum Boolean-Result auch noch SetLastError verwendet, oder z.B. ein eigenes LastError(s)/LastErrorMessage(s)-Property, wenn ein Fehlercode alleine nicht genügend Infos bieten kann. |
AW: Verständnisfrage zu Exit
Zitat:
Zitat:
Zitat:
In der Realität - wie gesagt, gegenwärtiger Erkenntniszustand - handhabe ich das unter anderem so, dass bei solchen Konstrukten alle beteiligten Funktionen durch
Delphi-Quellcode:
abgesichert sind, also keine Exception weitergereicht werden kann.
Try
Zitat:
![]() Um auf Uwe zu antworten: In den aufgerufenen Routinen stecken Fehlercodes, im am Schluss möglichst zielgerichtet ausgewertet und erst dann dem Anwender präsentiert werden. Man nehme als Beispiel IrfanView: Das registriert beim Einlesen haufenweise Fehler, sagt aber nur dann was, wenn es wirklich notwendig ist. Weiß nicht, ob es der Weisheit letzter Schluss ist, aber ich sammle zurzeit die Fehler in einem Set und schaue am Schluss, was die beste Reaktion ist. |
AW: Verständnisfrage zu Exit
Zitat:
Komische Entwicklung hier im Forum (oder besser allgemein immer öfters in Foren/Social Media) :gruebel: :stupid: |
AW: Verständnisfrage zu Exit
Ja, bei Exceptions gibt es keine "Warnungen".
Bei Exceptions kann man unterschiedliche Exception-Klassen verwenden und dann im Try-Except auch sehr leicht unterschiedliche reagieren, aber per se ist sowas bei Exceptions nicht vorgesehn, mit einer Ausnahme, den Stillen Exceptions, abgeleitet von EAbort. Auch z.B. einige Indy-Fehler werden vom Debugger ignoriert (die sehen da in einer Ausnahmeliste, welche man selbst erweitern kann) Bei HRESTULT kann man unterschiedliche Level definieren, von Info, über Warning zu Error oder FatalError. Auch der Delphi-Compler kennt sowas, also Fehler die sofort abbrechen (Fatal) oder erst am Ende (Error), wo vorher noch weitere Folgefehler sich melden dürfen. |
AW: Verständnisfrage zu Exit
Zitat:
![]() Das ist nun aber wirklich OT ;-) |
AW: Verständnisfrage zu Exit
Zitat:
|
AW: Verständnisfrage zu Exit
Zitat:
|
AW: Verständnisfrage zu Exit
Zitat:
|
AW: Verständnisfrage zu Exit
Zitat:
|
AW: Verständnisfrage zu Exit
Vielleicht sollte ich dieses Forum auch verlassen. Scheine für Euch ja eh nur Abschaum zu sein!
|
AW: Verständnisfrage zu Exit
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz