![]() |
AW: Befehlszeile ausführen
Ich verstehe nicht, auf welchen Code-Teil Du Dich beziehst. Wo wird nach einem Fehler einfach weitergemacht? Bin ich blind?
|
AW: Befehlszeile ausführen
@ Himitsu
Im Prinzip gebe ich Dir ja Recht, dass man mögliche Fehler mit try finally abfangen sollte, bei dem von Dir jetzt genannten Beispiel bin ich ganz bei Dir. Bei einem tstringlist.create erscheint es mir nicht sinnvoll @deddyh Wenn vorher nicht nil zugewiesen wird, kann das nur zu Problemen führen, wenn tstringlist.create eine Exception liefert. Und den Fall zu berücksichtigen und irgendwie abzufangen ist eben meiner Meinung nach unnötig, weil das Programm dann nichts sinnvolles mehr produzieren kann, wenn es weiterläuft. Ich würde es so machen:
Delphi-Quellcode:
Wenn das Erstellen der Stringlist eine Exception liefert, dann geht ohnehin nichts mehr. Und dann wird gleich die richtige Exception angezeigt.
output := TStringList.Create;
errors := TStringList.Create; try ... finally output.free; errors.free; end; |
AW: Befehlszeile ausführen
Zitat:
Es kann doch zufällig danach noch was freigegeben werden und dann paßt es wieder.
Delphi-Quellcode:
Jetzt könnte es ab dem nächten Except (von einem Try-Except) weitergehn, da wieder genug Speicher frei ist.
errors := nil;
output := GetMem(1000000000); // grade noch genug try errors := GetMem(100); // das war jetzt zuviel ... finally FreeMem(errors); // hier könnte es ohne :=nil nochmals knallen FreeMem(output); end; Ohne das :=nil könnte es aber passieren, daß es beim
Delphi-Quellcode:
nochmal knallt, dabei die ursprüngliche Fehlerursache/-adresse verfälscht und
FreeMem(errors)
Delphi-Quellcode:
ganicht mehr ausgeführt wird.
FreeMem(output)
du siehst ... ohne das :=nil wird es nur schlimmer und mit kann es besser werden [add] Zitat:
|
AW: Befehlszeile ausführen
Zitat:
|
AW: Befehlszeile ausführen
IIRC gilt dies nicht für lokale Variablen.
|
AW: Befehlszeile ausführen
Zitat:
|
AW: Befehlszeile ausführen
Sonst gäbe es die Warnung "Variable xyz ist möglicherweise nicht initialisiert worden" ja auch gar nicht, weil sinnlos ;)
|
AW: Befehlszeile ausführen
Globale Variablen (auf Heap?) werden initialisiert, da der gesamte Speicher anfangs eh null ist, welcher von Windows kommt.
Klassenfelder werden via ZeroMemory/FillMemory+0 in CreateInstance des Objekts genullt. Lokale Variablen (auf'm Stack) werden nicht initialisiert (abgesehn von sowas wie String/Interface/DynArray, welches immer initialisiert wird) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:18 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