AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein "Auf X zugewiesener Wert wird niemals benutzt" beheben
Thema durchsuchen
Ansicht
Themen-Optionen

"Auf X zugewiesener Wert wird niemals benutzt" beheben

Ein Thema von BlueStarHH · begonnen am 20. Jul 2010 · letzter Beitrag vom 20. Jul 2010
Antwort Antwort
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#1

"Auf X zugewiesener Wert wird niemals benutzt" beheben

  Alt 20. Jul 2010, 16:25
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;

Geändert von BlueStarHH (20. Jul 2010 um 16:39 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 20. Jul 2010, 16:30
Es gibt leider kein paralleles except und 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;
Markus Kinzler
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 20. Jul 2010, 16:34
@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.)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

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

  Alt 20. Jul 2010, 16:37
Dann dreh halt die Logik um; am Anfang True und im Exceptionhandler False
Markus Kinzler
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#5

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

  Alt 20. Jul 2010, 16:41
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...
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#6

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

  Alt 20. Jul 2010, 16:43
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
Heiko
  Mit Zitat antworten Zitat
Tharon

Registriert seit: 19. Okt 2004
Ort: Frankfurt/Main
12 Beiträge
 
Delphi 2007 Professional
 
#7

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

  Alt 20. Jul 2010, 17:23
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
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:15 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