![]() |
Allgemeines zun Exceptions
Guten Morgen,
Inzwischen hat sich bei mir eine ganze Reihe Fragen zum Thema Exceptions :lol: angesammelt, die ich euch gern stellen würde: Die erste wäre, ob GetTickCount ein Hardware-Zugriff ist und somit über try...except geschützt werden muss. Wie viel sollte ich überhaupt in den geschützten Block reinschreiben? Bei meinem Beispiel soll wirklich der Button2 nur frei geschaltet werden, wenn die Konvertierung geklappt hat:
Code:
Aber ich könnte ja auch einfach über exit abbrechen:
procedure TForm1.Button1Click(Sender: TObject);
a:integer; begin try a:=strtoint(edit1.text); Button2.Enabled:=true; except showmessage('Bitte geben Sie einen Integer-Wert ein.'); end; end;
Code:
Aber zu welcher von den beiden Methoden würdet Ihr mir raten?
procedure TForm1.Button1Click(Sender: TObject);
a:integer; begin try a:=strtoint(edit1.text); except showmessage('Bitte geben Sie einen Integer-Wert ein.'); exit; end; Button2.Enabled:=true; end; Der Punkt, der mich am meisten beschäftigt, ist der Schutz von TStrings. Die Methode TStringList.create soll ja immer über try...finally geschützt werden, was aber bei meinem Programm nicht möglich ist, da ich TStringList.create im Event Form1.OnCreate und TStrings free im Event Form1.OnClose aufrufe:
Code:
geht das so, wie ich’s gemacht habe auch in Ordnung?
var s:TStrings;
procedure TForm1.FormCreate(Sender: TObject); begin try s:=TStringList.Create; except showmessage('s konnte nicht erzeugt werden.'); s.Free; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin s.Free; end; Was mich auch ein bisschen stutzig macht, ist, dass in der Delphi-Hilfe nicht etwa TStringList.Create sondern TStrings.add geschützt wird. Der Speicher für den TStrings wird doch aber mit create reserviert und mit add nur aufgefüllt und nicht umgekehrt. Warum schlägt dann Borland diese Variante vor? Zu guter letzt hab ich in der Projektdatei den Code Application.CreateForm(TForm1, Form1) gefunden. Muss ich den nicht auch schützen? Danke, Borti |
Re: Allgemeines zun Exceptions
Hallo Borti!
Beide Methoden sind weniger zu empfehlen. Exceptions sollten nur dann angewendet werden, wenn die Fehler nicht vorhersehbar und vermeidbar sind. Bei einer Zahl im Edit ist es ganz einfach, nur die Eingabe gültiger Werte zuzulassen. Da sollte die Suchfunktion eine Menge Lösungen liefern - das Thema "Edit und Zahlen" haben wir ja "nur" mindestens einmal pro Woche :mrgreen: Ansonsten empfehle ich immer noch die Umwandlung des Strings mittels "Val" - der Fehlercode gibt an, ob es geklappt hat. Näheres findest Du in der OH. Mit "StrToInt" und Exceptions zu arbeiten, verbraucht relativ viel Rechenzeit. Gruß Dietmar Brüggendiek |
Re: Allgemeines zun Exceptions
Zitat:
Delphi-Quellcode:
Zu beachten ist, dass FSListe ein private Variable des Formulars ist.
procedure TForm1.FormCreate(Sender: TObject);
begin FSListe:=TStringList.Create; // die Stringliste wurde erzeugt, oder falls nicht wird eine EOutOfMemory Exception "geworfen" // eine Behandlung dieser Exception an dieser Stelle wäre kontraproduktiv FMybitmap := TBitmap.Create; end; // Was in FormCreate erzeugt wurde muss in FormDestroy wieder vernichtet werden // am Besten hält man dabei die umgekehrte Reihenfolge ein procedure TForm1.FormDestroy(Sender: TObject); begin FMyBitmap.Free; FSListe.Free; end; Sollte die StringListe eine globale Variable sein (was man vermeiden sollte) gelten andere Regeln. |
Re: Allgemeines zun Exceptions
Hallo Borti!
Ich würde dir mal das Exception - Tutorial auf ![]() Der direkte Link: ![]() greetz mytar :-D |
Re: Allgemeines zun Exceptions
Zitat:
Die Konvertierung über Val funktioniert (wieder was gelernt). Aber ich hab ähnliche Situationen zum Beispiele beim Zugriff auf Hardware und da stellt sich mir wieder die frage: welche variante ist besser, oder soll ich's gleich ganz anders machen? Das mit den TSrings versteh ich auch noch nicht ganz: Zitat:
gruß, Borti |
Re: Allgemeines zun Exceptions
Hallo Borti,
Zitat:
Das heißt beim Konstruktor-Aufruf von TStringList ist eine Exception sicherlich unnötig. Stell dir vor du setzt jeden Konstruktor-Aufruf in einen try-except-Block! mytar |
Re: Allgemeines zun Exceptions
Hallo,
Zitat:
![]() Zitat:
Danke, Borti |
Re: Allgemeines zun Exceptions
Ich lese auf deinem Link nichts von TStringList, bei TForm ist es eine andere Sache, dort ist eine Exception sicherlich sinnvoll.
Um Exceptions besser zu verstehen, schau dir einfach Sources von anderen Leuten an, und du kannt dir fast sicher sein, dass 90% bei TStringList keine Exception verwenden. gruesse mytar |
Re: Allgemeines zun Exceptions
ok, wird das beste sein. Aber wo kriegt ich so viele sources her?
jetzt noch zu den letzten beiden Punkten und ich geb ruh: ist GetTickCount jetzt ein Hardware-Zugriff, oder nicht? Und wie ich schon weiter oben geschrieben habe (06.08.2004, 11:49), wieviel soll ich jetzt in den try-Block reinnehmen? Danke, Borti |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 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