![]() |
Function Result
Guten Abend!
Eine Funktion abc soll False zurückgeben, wenn zwischen try..finally ein Fehler auftritt. Warum erhalte ich den Hinweis? Zitat:
Delphi-Quellcode:
function abc: Boolean;
var Obj: TObjectX; begin Result := False; Obj := TObjectX.Create; with Obj do try // .. // .. // .. // .. // .. // .. // .. Result := True; finally Free; end; end; |
Re: Function Result
Vielleicht, weil du die Funktion noch nirgends benutzt?
|
Re: Function Result
Das Result:=false wird nie benutzt. Weil, wenn ein Fehler auftritt, wird erstmal in den Finally-block gesprungen und dann ganz raus und keiner interessiert sich mehr für das Ergebnis von abc.
|
Re: Function Result
Delphi-Quellcode:
Machs lieber so ;)
function abc: Boolean;
begin Result := False; with TObjectX.Create do begin try try // .. Result := True; except // Result := False --> überflüssig end; finally Free; end; end; end; EDIT: Ups .. war einer schneller |
Re: Function Result
Zitat:
Zitat:
Delphi-Quellcode:
kommt der Hinweis nicht mehr ( :wall: )
Result := abc;
|
Re: Function Result
@mr_emre_d: wäre eine Möglichkeit. Doch warum 2 try..except wenn es mit einem nun geht? oder was ist der Vorteil?
|
Re: Function Result
also
der erste try finally block --> nachdem gecreated wurde MUSS es gefreet werden ! und zum zweiten block --> hier findet die exception statt... falls n fehler auftritt, result = false, sonst, falls es bis zur except zeile kommt (und es natürlich nicht ausführt) result = true ! :) Edit: Obwohl ... es ginge auch, wenn nichts in der except end zeile stehen würde .. |
Re: Function Result
@API: Dein erster Code ist völlig in Ordnung und der Rückgabewert ist so, wie du ihn haben möchtest.
Aber ... da Du den Resultwert niemals abgefragt hast
Delphi-Quellcode:
meckert der Compiler und fragt mal höflich an, warum du eine Funktion definierst, aber den Rückgabewert gar nicht haben willst (dann nimm doch eine procedure!) ;)
begin
abc; end; Gleiches Verhalten erhältst Du auch mit
Delphi-Quellcode:
und ist ja auch logisch, da soll der Rechner was machen, ist aber irgendwie für nix gut.
var abc : integer;
begin abc := 1; end; Hintergrund: Im Regelfall geht der Compiler davon aus, wenn ich einer Variablen einen Wert zuweise, dann will ich den ja wohl auch irgendwann mal benutzen. Mache ich das nicht, habe ich das vielleicht ja vergessen zu Benutzen (oder halt überflüssigen Kram programmiert). cu Oliver |
Re: Function Result
Hallo,
in diesem Fall schließe ich mich sirius und seiner Erklärung in Beitrag #2 an. Tritt innerhalb der Funktion eine Exception auf, erfolgt (meistens) über FINALLY ein Sprung zur Fehlerbehandlung und nicht zur Aufrufstelle. Der einzig mögliche Rückgabewert der Funktion kann also im gezeigten Beispiel (bei einem ordnungsgemäßen Ablauf) nur True sein; eine Prozedur würde hier daher vollkommen ausreichen, weil das Funktionsergebnis konstant ist. Nur wenn die im Funktionsrumpf auftretende Exception auch dort abgefangen wird, ist eine Funktion sinnvoll:
Delphi-Quellcode:
Bei dieser Vorgehensweise bleibt auch die Meldung des Compilers aus. Ob ein Abfangen der Exception hier sinnvoll ist, und welche Exceptions dafür in Frage kommen, das liegt im Ermessen des Programmierers.
function abc: Boolean;
var Obj: TObjectX; begin Result := False; try Obj := TObjectX.Create; with Obj do try // .. Result := True; finally Free; end; except on E: ESpezielleException do ... end; end; Gruß Hawkeye |
Re: Function Result
Zitat:
Delphi-Quellcode:
Es muss eigentlich auch keine spezielle Exception behandelt, man muss nur einen try / except Block haben, damit die Warnung nicht mehr ausgegeben wird.
function abc: Boolean;
var Obj: TObject; begin Result := False; Obj := TObject.Create; try try // etwas das schiefgehen kann ... ... // hat funktioniert: Result := True; except on E:Exception do begin // behandeln ... end; end; finally Obj.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:20 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