AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign try finally except Compiler hint H2077 Value assigned to 'Xyz' never used
Thema durchsuchen
Ansicht
Themen-Optionen

try finally except Compiler hint H2077 Value assigned to 'Xyz' never used

Ein Thema von Rollo62 · begonnen am 19. Apr 2017 · letzter Beitrag vom 19. Apr 2017
Antwort Antwort
Rollo62

Registriert seit: 15. Mär 2007
4.093 Beiträge
 
Delphi 12 Athens
 
#1

try finally except Compiler hint H2077 Value assigned to 'Xyz' never used

  Alt 19. Apr 2017, 11:08
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:
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;
Natürlich hat der Hint theoretisch Recht.

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
  Mit Zitat antworten Zitat
Der schöne Günther
Online

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

AW: try finally except Compiler hint H2077 Value assigned to 'Xyz' never used

  Alt 19. Apr 2017, 11:14
Du hast da ein try..finally . 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.



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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: try finally except Compiler hint H2077 Value assigned to 'Xyz' never used

  Alt 19. Apr 2017, 11:20
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
741 Beiträge
 
#4

AW: try finally except Compiler hint H2077 Value assigned to 'Xyz' never used

  Alt 19. Apr 2017, 11:22
Was passiert denn, wenn du im Finally-Block sowas schreibst:

Delphi-Quellcode:
  finally
     if Result = 0 then
       ShowMessage('Aber Hallo');
  end;
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.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.093 Beiträge
 
Delphi 12 Athens
 
#5

AW: try finally except Compiler hint H2077 Value assigned to 'Xyz' never used

  Alt 19. Apr 2017, 12:04
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

Delphi-Quellcode:
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;
Das Ergebnis sieht dann so aus:

clipboard01.jpg

clipboard02.jpg

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
Angehängte Dateien
Dateityp: zip T060_TryFinally.zip (53,2 KB, 1x aufgerufen)
  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 09:21 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