Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException (https://www.delphipraxis.net/205961-rueckgabewert-koennte-undefiniert-sein-und-exception-raiseouterexception.html)

Scurra 4. Nov 2020 07:50

Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
 
Hallo zusammen,

ich habe eine Frage zur Kompiler-Warnung "Rückgabewert der Funktion "..." könnte undefiniert sein:

An einigen Stellen in meinem Code verwende ich Exception.RaiseOuterException, um eine andere Exception-Klasse nach außen zu geben ohne die Information der ursprünglichen Exception zu verlieren. Das Ganze könnte in etwa so aussehen:

Delphi-Quellcode:
function SomeFunction: Integer
begin
  try
    // do something and set result
    // ...
    Result := 0;
  except
    Exception.RaiseOuterException(...);
  end;
end;
Wenn man diesen Code kompiliert, bekommt man eine Warnung, weil es sein kann, dass der Rückgabewert nicht gesetzt wird. Das Problem hier ist, dass der Kompiler nicht weiß, dass Exception.RaiseOuterException in jedem Fall eine Exception auslöst.

Gibt es eine Möglichkeit, dem Kompiler mitzuteilen, dass hier eine Exception ausgelöst wird?
Ersetzt man das Exception.RaiseOuterException durch "raise" oder fügt einfach am Ende des except-Blocks noch ein "raise" hinzu, dann verschwindet die Warnung, weil der Kompiler weiß, dass da eine Exception ausgelöst wird und es keinen Rückgabewert gibt. Ich möchte aber nicht extra noch ein zusätzliches "raise" hinzufügen, nur damit die Warnung verschwindet. Und Result einfach vor dem try zu inizialisieren wäre natürlich auch möglich, ist aber eine unnötige Zuweisung.

tewes 4. Nov 2020 08:40

AW: Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
 
" Und Result einfach vor dem try zu inizialisieren wäre natürlich auch möglich, ist aber eine unnötige Zuweisung. "

Genau das ist aber nötig, da function

Scurra 4. Nov 2020 08:51

AW: Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
 
Zitat:

Zitat von tewes (Beitrag 1476642)
Genau das ist aber nötig, da function

Kannst du das genauer erklären?

Es gibt in meinem Beispiel zwei Möglichkeiten:
1. Es tritt keine Exception auf. In diesem Fall wird Result im try-Block erfolgreich initialisiert => Zuweisung vor dem try-Block ist unnötig.
2. Es tritt eine Exception auf. In diesem Fall wird eine Exception ausgelöst und es gibt keinen Rückgabewert => Zuweisung vor dem try-Block ist unnötig.

Der schöne Günther 4. Nov 2020 09:02

AW: Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
 
Das geringste Übel wäre meiner Meinung nach den Rückgabewert unnötigerweise im except-Block zu setzen. Das hätte wohl wenigstens keine Auswirkungen auf den Normalfall:

Delphi-Quellcode:
function f(): Byte;
begin
   try
      Result := 42;
   except
      Exception.RaiseOuterException( EProgrammerNotFound.Create('derp') );
      Result := 0; // unnötig, aber compiler ist happy
   end;
end;
Oder - du setzt das Result einfach nach dem try..except.

tewes 4. Nov 2020 09:04

AW: Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
 
"keinen Rückgabewert" ist eben aus Sicht des Compilers nicht möglich da function

Es ist nur erlaubt den Rückgabewert beim Aufruf der function zu ignorieren.

Scurra 4. Nov 2020 10:32

AW: Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1476645)
Das geringste Übel wäre meiner Meinung nach den Rückgabewert unnötigerweise im except-Block zu setzen. Das hätte wohl wenigstens keine Auswirkungen auf den Normalfall

Ja, das sehe ich auch so.

Zitat:

Zitat von Der schöne Günther (Beitrag 1476645)
Oder - du setzt das Result einfach nach dem try..except.

Das wäre ungünstig, weil dann das Result im Erfolgsfall überschrieben wird ;) Man bräuchte zusätzlich ein Exit am Ende des try-Blocks.

dummzeuch 4. Nov 2020 11:31

AW: Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
 
So sollte es am wengsten stören:
Delphi-Quellcode:
function SomeFunction: Integer
begin
  try
    // do something and set result
    // ...
    Result := 0;
  except
    Exception.RaiseOuterException(...);
    Result := 0; // damit der Compiler nicht motzt
  end;
end;
Auch wenn die zweite Zuweisung nie ausgeführt wird, so stellt sie doch den Compiler zufrieden. Der erzeugte Code ist ja minimal. Es könnte allerdings jemanden verwirren, der den Code liest.

himitsu 4. Nov 2020 12:19

AW: Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
 
Tja, könnte man bei Funktionen/Methoden angeben, dass sie immer eine Excepion werfen, dann könnte der Compiler das wissen, aber das geht nicht, also weiß er es nicht, dass es danach nicht weitergeht.

Statt dem Result zuzuweisen würde ich hier einfach raise nutzen.
Beides wird nicht ausgeführt, aber beim Raise ist das Verhalten "klarer" und man ist unabhängig davon ob die Funktion ein Result hat oder nicht und welchen Typ die hat.
Delphi-Quellcode:
  try
    // do something and set result
    // ...
    Result := 0;
  except
    Exception.RaiseOuterException(...);
    raise; // damit der Compiler nicht motzt
  end;
Ich find's eh bissl komisch, dass die OuterException so unpraktisch verpackt wurde.

freimatz 4. Nov 2020 13:34

AW: Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
 
Zitat:

Zitat von tewes (Beitrag 1476646)
"keinen Rückgabewert" ist eben aus Sicht des Compilers nicht möglich da function
Es ist nur erlaubt den Rückgabewert beim Aufruf der function zu ignorieren.

Doch. Bei einer nicht behandelten Exception gibt es keinen Rückgabewert, zumindest kommt man nicht dran.


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