Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   "Auf X zugewiesener Wert wird niemals benutzt" beheben (https://www.delphipraxis.net/153091-auf-x-zugewiesener-wert-wird-niemals-benutzt-beheben.html)

BlueStarHH 20. Jul 2010 16:25


"Auf X zugewiesener Wert wird niemals benutzt" beheben
 
Hallo,

ich habe eine Funktion, die nur dann true zurückgeben soll, wenn der Code in ihr keine Exception verursacht hat. Das habe wie unten stehend gemacht. Doch dann kommt die Kompilermeldung "Auf 'TMainDlg.TestFunktion' zugewiesener Wert wird niemals benutzt". Was muss ich machen, damit die Meldung nicht mehr angezeigt wird?

Delphi-Quellcode:
function TMainDlg.TestFunktion: Boolean;
begin
  Result := False; //<-- hier kommt die Meldung.
  try
    //Hier steht Code, der eine Exception auslösen könnte. Dadurch wird das Result unten nur zugeweisen, wenn es keine Exception gibt. Ansonsten müsste doch das obere Result benutzt werden. Was ja laut Compilier angeblich nie benutzt wird.

    Result := true;
  finally
    //...
  end;
end;

mkinzler 20. Jul 2010 16:30

AW: "Auf X zugewiesener Wert wird niemals benutzt" beheben
 
Es gibt leider kein paralleles
Delphi-Quellcode:
except
und
Delphi-Quellcode:
finally
Versuch mal
Delphi-Quellcode:
function TMainDlg.TestFunktion: Boolean;
begin
  Result := False;
  try
    try
      //Hier steht Code, der eine Exception auslösen könnte. Dadurch wird das Result unten nur zugeweisen, wenn es keine Exception gibt.
    except
       on Exception do
           Result := true; //<-- hier kommt die Meldung.
    end;
  finally
    //Hier steht was, was immer ausgeführt werden muss
  end;
end;

BlueStarHH 20. Jul 2010 16:34

AW: "Auf X zugewiesener Wert wird niemals benutzt" beheben
 
@mkinzler: Dein Code gibt true zurück, wenn EINE Exception aufgetrten ist. Die Funktion soll aber nur true zurückgeben, wenn KEINE Exception aufgetrten ist. Das mit dem Finally ist nicht das Problem (Da war der Kommentar von mir zu ungenau formuliert. Ich lösche den mal um nicht noch andere zu verwirren.)

mkinzler 20. Jul 2010 16:37

AW: "Auf X zugewiesener Wert wird niemals benutzt" beheben
 
Dann dreh halt die Logik um; am Anfang True und im Exceptionhandler False

BlueStarHH 20. Jul 2010 16:41

AW: "Auf X zugewiesener Wert wird niemals benutzt" beheben
 
Zitat:

Zitat von mkinzler (Beitrag 1036388)
Dann dreh halt die Logik um; am Anfang True und im Exceptionhandler False

Danke mache ich, auf die einfachsten Dinge kommt man wieder nicht ;-) Trotzdem ist die Kompilermeldung aber komisch, da sie nicht stimmt...

hoika 20. Jul 2010 16:43

AW: "Auf X zugewiesener Wert wird niemals benutzt" beheben
 
Hallo,

die Compilermeldung ist doch eindeutig.

Da für den Compiler auf jeden Fall Result:= True aufgerufen wird, die Exception könnte kommen, muss aber nicht.

Delphi-Quellcode:
function TMainDlg.TestFunktion: Boolean;
begin
  Result := False; //<-- hier kommt die Meldung.
  try
    //Hier steht Code, der eine Exception auslösen könnte. Dadurch wird das Result unten nur zugeweisen, wenn es keine Exception gibt. Ansonsten müsste doch das obere Result benutzt werden. Was ja laut Compilier angeblich nie benutzt wird.

    Result := true;
  except
    //...
  end;
end;
Oder wenn except und finally


Delphi-Quellcode:
function TMainDlg.TestFunktion: Boolean;
var
  StrList: TStringList;
begin
  Result := False; //<-- hier kommt die Meldung.
  try
    StrList:= TStringList.Create;
    try
    finally
      StrList.Free;
    end;

    Result := true;
  except
    //...
  end;
end;

Heiko

Tharon 20. Jul 2010 17:23

AW: "Auf X zugewiesener Wert wird niemals benutzt" beheben
 
Hallo,

wie Hoika schon erklärte, die Compiler-Meldung ist völlig korrekt.

Also... Du möchtest erreichen, dass Deine Funktion nur dann True zurück liefert, wenn keine Exception aufgetreten ist. Das ist genau das, was immer geschieht, denn so funktioniert nun mal das Exception-Konzept. Wenn eine Exception in Deiner Funktion auftritt, dann liefert diese Funktion gar nichts zurück, denn die Funktion wird (nach Abarbeitung eines eventuell vorhandenen finally-Blockes) direkt verlassen, genauso wie der aufrufende Kontext. Wird die Exception nicht irgendwo auf dem Weg "nach oben" abgefangen, wird sie schließlich von der Application als Meldung angezeigt. Das alles kann man aber auch in der Delphi-Hilfe nachlesen^^

Korrekt wäre Dein Funktionsgerüst also so:

Delphi-Quellcode:
function TMainDlg.TestFunktion: Boolean;
begin
  try
    //Hier steht Code, der eine Exception auslösen könnte. Dadurch wird das Result ganz unten am Ende der Funktion nur zugewiesen, wenn es keine Exception gibt.
  except
    //...
  end;

  Result := True;
end;
Wenn Du jedoch eine eigene Exception-Behandlung in Deine Funktion einbaust und keine Exception oder nur bestimmte Exceptions nicht "raus lässt", dann sähe das Ganze wie folgt aus:

Delphi-Quellcode:
function TMainDlg.TestFunktion: Boolean;
var
  bOK:   Boolean;
begin

  bOK := True;

  try
    //...
  except
    on e: Exception do
    begin
      bOK := False;
      //... z.B. eigene Meldung anzeigen, Log schreiben, etc. ...
    end;
  end;

  Result := bOK;
end;
Und bitte nicht daran stören, dass ich im obigen Beispiel alle Exceptions abfange (on e: Exception) und nicht nur bestimmte - das soll ja nur ein Beispiel sein und das Prinzip verdeutlichen und daher möglichst einfach bleiben ;-)

Noch ein Hinweis am Rande:
Viele halten es für einen guten Stil (dazu gehöre ich selbst auch), Result grundsätzlich nur am Ende einer Funktion zuzuweisen, also als allerletztes Statement einer Funktion - und nicht mittendrin und vielleicht sogar noch an mehreren Stellen. ;-)

LG


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 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