AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Function Result

Ein Thema von API · begonnen am 17. Jan 2009 · letzter Beitrag vom 18. Jan 2009
Antwort Antwort
Seite 1 von 3  1 23      
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#1

Function Result

  Alt 17. Jan 2009, 21:07
Guten Abend!

Eine Funktion abc soll False zurückgeben, wenn zwischen try..finally ein Fehler auftritt.
Warum erhalte ich den Hinweis?

Zitat:
[Hint] unit1.pas(83): Value assigned to 'abc' never used
Delphi-Quellcode:
function abc: Boolean;
var
  Obj: TObjectX;
begin
  Result := False;
  Obj := TObjectX.Create;
  with Obj do
  try
    // ..
    // ..
    // ..
    // ..
    // ..
    // ..
    // ..
    Result := True;
  finally
    Free;
  end;
end;
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Function Result

  Alt 17. Jan 2009, 21:09
Vielleicht, weil du die Funktion noch nirgends benutzt?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Function Result

  Alt 17. Jan 2009, 21:12
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#4

Re: Function Result

  Alt 17. Jan 2009, 21:13
Delphi-Quellcode:
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;
Machs lieber so

EDIT: Ups .. war einer schneller
  Mit Zitat antworten Zitat
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#5

Re: Function Result

  Alt 17. Jan 2009, 21:15
Zitat von sirius:
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.
Warum nicht? Result muss ja nicht zwingend False sein wenn eine Exception auftritt.


Zitat von omata:
Vielleicht, weil du die Funktion noch nirgends benutzt?
Die Funktion wird aufgerufen, ob ich habe Result nicht ausgewertet, also mit Result := abc; kommt der Hinweis nicht mehr ( )
  Mit Zitat antworten Zitat
API

Registriert seit: 18. Apr 2004
637 Beiträge
 
#6

Re: Function Result

  Alt 17. Jan 2009, 21:17
@mr_emre_d: wäre eine Möglichkeit. Doch warum 2 try..except wenn es mit einem nun geht? oder was ist der Vorteil?
  Mit Zitat antworten Zitat
mr_emre_d
(Gast)

n/a Beiträge
 
#7

Re: Function Result

  Alt 17. Jan 2009, 21:26
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 ..
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

Re: Function Result

  Alt 18. Jan 2009, 00:48
@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:
begin
  abc;
end;
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!)

Gleiches Verhalten erhältst Du auch mit
Delphi-Quellcode:
var abc : integer;
begin
  abc := 1;
end;
und ist ja auch logisch, da soll der Rechner was machen, ist aber irgendwie für nix gut.

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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Function Result

  Alt 18. Jan 2009, 08:53
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:
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;
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.

Gruß Hawkeye
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Function Result

  Alt 18. Jan 2009, 10:44
Zitat von Hawkeye219:
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.
Oder so, damit man in der Exceptionbehandlung auch noch auf das Objekt zugreifen kann:

Delphi-Quellcode:
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;
Es muss eigentlich auch keine spezielle Exception behandelt, man muss nur einen try / except Block haben, damit die Warnung nicht mehr ausgegeben wird.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz