![]() |
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:
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.
function SomeFunction: Integer
begin try // do something and set result // ... Result := 0; except Exception.RaiseOuterException(...); end; end; 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. |
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 |
AW: Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
Zitat:
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. |
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:
Oder - du setzt das Result einfach nach dem try..except.
function f(): Byte;
begin try Result := 42; except Exception.RaiseOuterException( EProgrammerNotFound.Create('derp') ); Result := 0; // unnötig, aber compiler ist happy end; end; |
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. |
AW: Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
Zitat:
Zitat:
|
AW: Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
So sollte es am wengsten stören:
Delphi-Quellcode:
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.
function SomeFunction: Integer
begin try // do something and set result // ... Result := 0; except Exception.RaiseOuterException(...); Result := 0; // damit der Compiler nicht motzt end; end; |
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:
Ich find's eh bissl komisch, dass die OuterException so unpraktisch verpackt wurde.
try
// do something and set result // ... Result := 0; except Exception.RaiseOuterException(...); raise; // damit der Compiler nicht motzt end; |
AW: Rückgabewert könnte undefiniert sein und Exception.RaiseOuterException
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:12 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-2025 by Thomas Breitkreuz