Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Warum könnte hier der Rückgabewert undefiniert sein? (https://www.delphipraxis.net/182499-warum-koennte-hier-der-rueckgabewert-undefiniert-sein.html)

Der schöne Günther 29. Okt 2014 15:42

Delphi-Version: 5

Warum könnte hier der Rückgabewert undefiniert sein?
 
Der Compiler sagt
Code:
[dcc32 Warnung] Atomkraftwerksteuerung.dpr(22): W1035 Rückgabewert der Funktion 'someFunc' könnte undefiniert sein
bei folgendem Code:
Delphi-Quellcode:
uses System.SysUtils;

function someFunc(): Boolean;
begin
   try
      try
         Result := True;
      except
         on EProgrammerNotFound do Result := False;
      else
         raise;
      end;
   finally
      //
   end;
end;
Warum?

Ohne try..finally beschwert er sich nicht. Ohne das else im try..except auch nicht. Ist das ein Fehler?

Neutral General 29. Okt 2014 15:47

AW: Warum könnte hier der Rückgabewert undefiniert sein?
 
Delphi-Quellcode:
function someFunc(): Boolean;
begin
   try
      try
         Result := True; // 1
      except
         on EProgrammerNotFound do Result := False;
      else
         raise; // 2
      end;
   finally
      // 3
   end;
   // 3
end;
(1) Exception tritt auf, keine EProgrammerNotFound Exception, daher re-raise (2), Exception landet im Finally Block (3) wo nichts passiert. Und immer noch wurde kein Result gesetzt. Ohne try-finally fliegt er beim re-raise ja komplett aus der Funktion. Und das raisen einer Execption die eine Funktion beendet reicht Delphi als "Rückgabewert"

himitsu 29. Okt 2014 16:11

AW: Warum könnte hier der Rückgabewert undefiniert sein?
 
Wenn das raise aisgelöst wird, dann landet es zwar im Finally, aber nach dem Finally-End rauscht es Raus und Result wird nicht mehr benötigt.
Delphi-Quellcode:
function someFunc(): Boolean;
begin
   try
//      try
//         Result := True;
//      except
//         on EProgrammerNotFound do Result := False;
//      else
//         raise;
//      end;
   finally
      //
   end;
end;
Kein result, wenn es schon vor dem Try-Finally knallt.

Fazit: Result vor dem Try-Except initialisieren.

[edit] Ich liebe es, wie die DP einfach so Leerzeichen aus Quellcodes löscht.

Der schöne Günther 29. Okt 2014 16:15

AW: Warum könnte hier der Rückgabewert undefiniert sein?
 
Ich stelle mich zu dumm an, denn ich verstehe bei euch beiden die Begründung nicht.

Mir geht es nicht darum die Warnung abzustellen, sondern zu verstehen
  • ob der Compiler Recht hat
  • ob ich Recht habe
wenn ich sage "Das Ergebnis ist eindeutig definiert"


Noch kürzeres Beispiel:
Delphi-Quellcode:
function f(): Boolean;
begin
   try
      if (Random() > 0.5) then raise EProgrammerNotFound.Create(EmptyStr);
      Result := False;
   finally
      //
   end;
end;
Der Rückgabewert kann doch hier überhaupt nicht undefiniert sein. Trotzdem meint der Compiler, es wäre nicht so.

Medium 29. Okt 2014 17:22

AW: Warum könnte hier der Rückgabewert undefiniert sein?
 
Zitat:

Und das raisen einer Execption die eine Funktion beendet reicht Delphi als "Rückgabewert"
Glaube ich nicht so wirklich, habe es aber jetzt auch nicht getestet.

IMHO prüft der Compiler lediglich, ob alle möglichen Codepfade dazu führen, dass am Ende der Funktion irgend jemand irgend wann mal etwas an "Result" zugewiesen hat. Fliegt man mit einer Exception raus, trifft das nicht zu.

Interessant wäre dann aber z.B. so ein Fall
Delphi-Quellcode:
function Foo: Integer;
begin
  Result := Bar();
end;
Was, wenn Bar() eine Exception auslöst, und ebenfalls in diesem Fall keine Zuweisung an sein Result gemacht hat? Schleift der Compiler das mit nach Foo() durch? (Mal angenommen Bar() ist nicht im Quelltext verfügbar und wird nicht mit Foo() zusammen übersetzt.)

Luckie 29. Okt 2014 17:23

AW: Warum könnte hier der Rückgabewert undefiniert sein?
 
Dann machen wir es mal anders herum. Begründe du mal.


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