AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bitte Warning erklären

Ein Thema von Shark99 · begonnen am 9. Dez 2010 · letzter Beitrag vom 9. Dez 2010
Antwort Antwort
Seite 1 von 2  1 2      
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#1

Bitte Warning erklären

  Alt 9. Dez 2010, 16:51
Delphi-Version: 5
Bei dem Code:
Delphi-Quellcode:
var
  list: TStringList;
begin

  try
    list := TStringList.Create;
bekomme ich diese Warnung:

[Warning] LanguageHandlerUnit.pas(126): Variable 'list' might not have been initialized

Kann mir bitte erklären wieso ich vor try list := nil zuweisen muss?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Bitte Warning erklären

  Alt 9. Dez 2010, 17:05
Das muß davor.
Delphi-Quellcode:
var
  list: TStringList;
begin
  list := TStringList.Create;
  try
    ...
  finally
    list.Free;
  end;
Delphi prüft, ob das list im finally auf jedenfall initialisiert wurde und das trifft nur zu, wenn es vor'm Try passiert.

- Speicher reservieren (oder was auch immer)
- direkt danach das TRY
- dann kann sonstwas zwischen try-finally stehn
- und dann im finally als Erstes das .Free
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

AW: Bitte Warning erklären

  Alt 9. Dez 2010, 18:48
Man kann hier evtl. auch noch erwähnen, dass wenn im Konstruktor eine Exception auftritt, das Objekt nicht erzeugt wird. Daher wäre es falsch, das list := TStringList.Create; hier nach dem try einzufügen -- warum sollte klar sein.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Bitte Warning erklären

  Alt 9. Dez 2010, 18:58
Was wäre aber, wenn man zwei Objekte hat und die Erzeugung des ersten (warum auch immer) fehl schlägt?
Delphi-Quellcode:
var
  list1: TStringList;
  list2: TStringList;
begin
  list1 := TStringList.Create;
  // vorige Zeile oder hier schlägt etwas fehl...
  list2 := TStringList.Create;
  try
    ...
  finally
    list2.Free;
  end;
Hier müsste man wohl jede Menge try-Blöcke verschachteln?

Auch wenn ich mich unbeliebt mache, ich setze solche Schutzblöcke eigentlich selten ein. Meist nur, wenn ein E/A-Fehler passieren kann und dieser intern ausgeglichen werden soll.
Ansonsten achte ich lieber darauf, alle negativen Voraussetzungen Divisor = 0, Objekt = nil etc. vorab abzuprüfen.

Ich gehe schon mal in Deckung ...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Bitte Warning erklären

  Alt 9. Dez 2010, 19:00
Entweder verschachteln oder die folgenden initial mit nil belegen, bevor das erste Objekt erzeugt wird.

[edit] Achja, Exception-Handling ist ja nicht dazu gedacht, mögliche Fehlerquellen nicht im Vorfeld ausschließen zu müssen, sondern eher dazu, auf Fehler reagieren zu können, die nicht vorhersehbar sind (Hardwaredefekt, volle Festplatte oder sowas). [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Bitte Warning erklären

  Alt 9. Dez 2010, 19:02
Hier müsste man wohl jede Menge try-Blöcke verschachteln?
Jupp
http://www.delphipraxis.net/155747-t...ml#post1060288
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#7

AW: Bitte Warning erklären

  Alt 9. Dez 2010, 19:10
Auch wenn es unschön aussieht, wäre es für die eigene Anwendung auch gesünder. Kann ja evtl. auch vorkommen, dass andere deinen Code nutzen und daher wäre es auch sehr ratsam alles so robust wie möglich zu bauen. Selbst wenn es nur "interne" Klassen sind, die also innerhalb einer eigenen Komponente genutzt werden, baue ich diese so auf, dass interne Fehler durch passende Exceptions aufgedeckt werden, obwohl ich eigentlich weiß, dass ich den Code richtig nutze. Sicher ist sicher (und insgesamt, dann auch sauber programmiert)

-- EDIT: Wuhu, Beitragscounter = Geburtsjahr -- gerade Zahlen kann jeder feiern
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Bitte Warning erklären

  Alt 9. Dez 2010, 19:14
Soll heißen, selbst wann man keine Exceptions behandeln will, sollte man dennoch die Resourcen absichern.

Exceptionbehandlung ala Try-Except ist ein Kann ... muß aber nicht
Ein Resourcenschutzblock ala Try-Finally sollte aber dennoch rein.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Bitte Warning erklären

  Alt 9. Dez 2010, 19:16
Ich will jetzt keine große Grundsatzdiskussion lostreten, aber im obigen Beispiel und ähnlich überschaubaren Programmteilen würde ich erst mal nicht mit Problemen rechnen.
Mir ist aber schon öfters aufgefallen, dass die try-Blöcke auch in trivialen Zusammenhängen eingesetzt werden. Eine Lösung das Problems bietet die doch aber auch nicht...
Ok, eine erzeugte Komponente wird wieder freigegeben, aber das ist ja eigentlich das geringste Problem. Die Prozedur o.ä. wurde trotzdem nicht korrekt durchgeführt.
Insofern ist der Systemzustand mit oder ohne try-Behandlung relativ inkonsistent.

Anders sieht es z.B. bei Dateizugriffen o.ä. aus (oder an Stellen, die immer "erwartet" problematisch verlaufen können und dementsprechend eine alternative Behandlung benötigen). Hier kann ich Fehler abfangen und explizit darauf eingehen.

Der Sinn von try-Blöcken zur Freigabe von Komponenten hat sich mir noch nie wirklich erschlossen (auch wenn ich es häufig in fremden Quellen sehe).

Zur Entschärfung des Konfliktpotenzials gleich mal einen Glückwunsch an s.h.a.r.k hinterher! Himitsu kann ich gerade nichts passendes anbieten
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli ( 9. Dez 2010 um 19:19 Uhr)
  Mit Zitat antworten Zitat
Bernerbaer
(Gast)

n/a Beiträge
 
#10

AW: Bitte Warning erklären

  Alt 9. Dez 2010, 19:32
Für mich ist folgendes Konstrukt eigentlich der übersichtlichste und sauberste Weg um das Bsp von sahli umzusetzen.
Delphi-Quellcode:
var
  list1: TStringList;
  list2: TStringList;
begin
  list1:=nil;
  list2:=nil;
  try
    list1 := TStringList.Create;
    list2 := TStringList.Create;
  
    ...
  finally
    list1.free;
    list2.Free;
  end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:48 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