![]() |
try finally except Compiler hint H2077 Value assigned to 'Xyz' never used
Hallo zusammen,
mich nerven diese nicht-abschaltbaren hints, und ich frage mich wie sicher es ist wenn ich den Rat befolge: Normalerweise mache ich es so, und Initialisiere die Variable bevor ich in so ein Konstrukt gehe (gute alte Praxis, besser sicher als superdämliche Fehler ewig suchen).
Delphi-Quellcode:
Natürlich hat der Hint theoretisch Recht.
function TXyz.DeviceList_Count(const ADeviceList: TXyz_List) : Integer;
begin Result := 0; // Hier kommt der Hint das dies überflüssig wäre try Result := ADeviceList.CalculateCount; finally // Aber habe ich nicht bei einer Exception hier womöglich einen undefinierten Wert ? end; end; Aber was passiert wenn CalculateCount nicht richtig zurückkommt, und eine Exception wirft, ist dann Result "halb" initialisiert ? Ich bin ein Freund von definierten Werten, deshalb mache ich das so, in der Hoffnung das eine Exception das berücksichtigt. Auch pro-Forma für den Fall das es mal irgendwelche Compilerfehler gibt wo sich dann doch etwas einschleicht. Wer weiss denn wie der Kompiler das im Fehlerfall wirklich umsetzt ? Rollo |
AW: try finally except Compiler hint H2077 Value assigned to 'Xyz' never used
Du hast da ein
Delphi-Quellcode:
. Wenn da eine Exception kommt, dann ist der Rückgabewert deine geringste Sorge denn deine Funktion kehrt nicht zurück. Sie behandelt die Exception nicht, also bubbelt die eins weiter nach oben durch.
try..finally
Delphi-Quellcode:
uses System.SysUtils;
procedure p(); begin raise EProgrammerNotFound.Create('nope'); end; function f(): Integer; begin Result := 0; //H2077 Auf 'f' zugewiesener Wert wird niemals benutzt try p(); Result := 42; finally // nothing end; end; var someValue: Integer; begin try someValue := f(); WriteLn('Der Wert ist ', someValue); except WriteLn('Wir haben keinen Wert'); end; WriteLn(sLineBreak, 'Ende.'); Readln; end. |
AW: try finally except Compiler hint H2077 Value assigned to 'Xyz' never used
Wird ein Exception geschmissen wird der Rückgabewert nicht ausgewertet. Dein Programmablauf wird ja beim nächsten finally/except-Statement fortgeführt.
Alte Delphi-Versionen haben (fälschlicherweise) die fehlende Initialisierung des Result-Wertes angemeckert. Das wurde in neueren Delphi/Compilerversionen gefixt und jetzt wird korrekt die unnötige Zuweisung moniert. |
AW: try finally except Compiler hint H2077 Value assigned to 'Xyz' never used
Was passiert denn, wenn du im Finally-Block sowas schreibst:
Delphi-Quellcode:
Bei mir kommt dann keine Warnung mehr. Und wenn du dort nicht auf Result zugreifst, braucht es auch nicht initialisiert zu sein, denn siehe #2.
finally
if Result = 0 then ShowMessage('Aber Hallo'); end; |
AW: try finally except Compiler hint H2077 Value assigned to 'Xyz' never used
Liste der Anhänge anzeigen (Anzahl: 3)
Dankesehr für die Antworten und die Mühe.
Ich habe das Beispeil von Günther noch etwas erweitert, um mal genau zu sehen was eigentlich passiert, siehe Anhang. Ihr habt natürlich Recht (und der Compiler-Hint auch), ein bischen Nachdenken hilft immer :pale:
Delphi-Quellcode:
Das Ergebnis sieht dann so aus:
procedure p();
begin raise EProgrammerNotFound.Create('nope'); end; function TForm1.fCrashable(bShallCrash : Boolean): Integer; begin Result := 88; //H2077 Auf 'f' zugewiesener Wert wird niemals benutzt Memo1.Lines.Add( '- In fCrashable.Vorgabe: Result = ' + Result.ToString ); try if bShallCrash then begin p(); end; Result := 42-1; Memo1.Lines.Add( '- In fCrashable.Zwischenwert: Result = ' + Result.ToString ); finally // nothing Inc(Result); Memo1.Lines.Add( '- In fCrashable.finally: Result = ' + Result.ToString ); end; end; procedure TForm1.Button1Click(Sender: TObject); var iRes: Integer; begin try iRes := 1000; Memo1.Lines.Clear; Memo1.Lines.Add( 'Ohne Crash' ); iRes := 77; // diese Vorgabe ist überflüssig wenns nicht crasht Memo1.Lines.Add( '- Variable vordefiniert auf 77' ); Memo1.Lines.Add( '- Aufruf fCrashable( False )' ); iRes := fCrashable(False); Memo1.Lines.Add( '- Ergebnis: Result = ' + iRes.ToString ); except Memo1.Lines.Add( '- Exception: Result = ' + iRes.ToString ); end; end; procedure TForm1.Button2Click(Sender: TObject); var iRes: Integer; begin try Memo1.Lines.Clear; Memo1.Lines.Add( 'Mit Crash' ); iRes := 77; // diese Vorgabe wird übernommen, im Fall eines Crashes Memo1.Lines.Add( '- Variable vordefiniert auf 77' ); Memo1.Lines.Add( '- Aufruf fCrashable( False )' ); iRes := fCrashable(True); // Diese Zuweisung wird NICHT ausgeführt bei Crash Memo1.Lines.Add( '- Ergebnis: Result = ' + iRes.ToString ); except Memo1.Lines.Add( '- Exception: Result = ' + iRes.ToString ); end; end; Anhang 47150 Anhang 47151 Viellleicht hilft es ja dem nächsten auch wieder auf die Sprünge. Ich muss mich jedenfalls wohl mal wieder um ein paar alte Leichen bei mir kümmern. Rollo |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:40 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