AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Warum könnte hier der Rückgabewert undefiniert sein?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Der schöne Günther · begonnen am 29. Okt 2014 · letzter Beitrag vom 29. Okt 2014
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

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

  Alt 29. Okt 2014, 16:42
Delphi-Version: 5
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?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

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

  Alt 29. Okt 2014, 16:47
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"
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 29. Okt 2014, 17:11
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

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

  Alt 29. Okt 2014, 17:15
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.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#5

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

  Alt 29. Okt 2014, 18:22
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.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

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

  Alt 29. Okt 2014, 18:23
Dann machen wir es mal anders herum. Begründe du mal.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 14:31 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