![]() |
Delphi-Version: 5
Warum könnte hier der Rückgabewert undefiniert sein?
Der Compiler sagt
Code:
bei folgendem Code:
[dcc32 Warnung] Atomkraftwerksteuerung.dpr(22): W1035 Rückgabewert der Funktion 'someFunc' könnte undefiniert sein
Delphi-Quellcode:
Warum?
uses System.SysUtils;
function someFunc(): Boolean; begin try try Result := True; except on EProgrammerNotFound do Result := False; else raise; end; finally // end; end; Ohne try..finally beschwert er sich nicht. Ohne das else im try..except auch nicht. Ist das ein Fehler? |
AW: Warum könnte hier der Rückgabewert undefiniert sein?
Delphi-Quellcode:
(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"
function someFunc(): Boolean;
begin try try Result := True; // 1 except on EProgrammerNotFound do Result := False; else raise; // 2 end; finally // 3 end; // 3 end; |
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:
Kein result, wenn es schon vor dem Try-Finally knallt.
function someFunc(): Boolean;
begin try // try // Result := True; // except // on EProgrammerNotFound do Result := False; // else // raise; // end; finally // end; end; Fazit: Result vor dem Try-Except initialisieren. [edit] Ich liebe es, wie die DP einfach so Leerzeichen aus Quellcodes löscht. |
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
Noch kürzeres Beispiel:
Delphi-Quellcode:
Der Rückgabewert kann doch hier überhaupt nicht undefiniert sein. Trotzdem meint der Compiler, es wäre nicht so.
function f(): Boolean;
begin try if (Random() > 0.5) then raise EProgrammerNotFound.Create(EmptyStr); Result := False; finally // end; end; |
AW: Warum könnte hier der Rückgabewert undefiniert sein?
Zitat:
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:
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.)
function Foo: Integer;
begin Result := Bar(); end; |
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 22:23 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 by Thomas Breitkreuz