Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Allgemeines zun Exceptions (https://www.delphipraxis.net/27157-allgemeines-zun-exceptions.html)

Borti 5. Aug 2004 09:32


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:
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;
Aber ich könnte ja auch einfach über exit abbrechen:
Code:
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;
Aber zu welcher von den beiden Methoden würdet Ihr mir raten?

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:
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;
geht das so, wie ich’s gemacht habe auch in Ordnung?

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

Brüggendiek 5. Aug 2004 22:06

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

shmia 6. Aug 2004 07:59

Re: Allgemeines zun Exceptions
 
Zitat:

Zitat von Borti
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:
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;
geht das so, wie ich’s gemacht habe auch in Ordnung?

Nein, richtig wäre:
Delphi-Quellcode:
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;
Zu beachten ist, dass FSListe ein private Variable des Formulars ist.
Sollte die StringListe eine globale Variable sein (was man vermeiden sollte) gelten
andere Regeln.

mytar 6. Aug 2004 10:06

Re: Allgemeines zun Exceptions
 
Hallo Borti!

Ich würde dir mal das Exception - Tutorial auf Delphi-Source.de empfehlen.

Der direkte Link:
http://www.delphi-source.de/tutorial...ptions/?page=1

greetz
mytar :-D

Borti 6. Aug 2004 10:49

Re: Allgemeines zun Exceptions
 
Zitat:

Ich würde dir mal das Exception - Tutorial auf Delphi-Source.de empfehlen.
:lol: Da komm ich doch grad her.

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:

// die Stringliste wurde erzeugt, oder falls nicht wird eine EOutOfMemory Exception "geworfen"
// eine Behandlung dieser Exception an dieser Stelle wäre kontraproduktiv
Warum denn das? :wiejetzt:
gruß,
Borti

mytar 8. Aug 2004 18:27

Re: Allgemeines zun Exceptions
 
Hallo Borti,

Zitat:

Zitat von Borti
Das mit den TSrings versteh ich auch noch nicht ganz:
Zitat:

// die Stringliste wurde erzeugt, oder falls nicht wird eine EOutOfMemory Exception "geworfen"
// eine Behandlung dieser Exception an dieser Stelle wäre kontraproduktiv
Warum denn das? :wiejetzt:
gruß,
Borti

Ich denke shmia hat vollkommen recht. IMHO sind Exceptions dazu da, Ausnahmefälle zu behandeln, d.h. Bei einem Fehler im try-Block wenn nötig etwas auszuführen (except) oder auf jeden Fall etwas auszuführen, egal ob ein Fehler im try-Block passiert, oder nicht (finally).

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

Borti 11. Aug 2004 10:58

Re: Allgemeines zun Exceptions
 
Hallo,
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!
Aber laut folgendem tutorial von http://www.delphi-source.de/tutorial...ptions/?page=5 sollte man es machen.
Zitat:

Es ist sinnvoll, das try direkt nach den Konstruktor-Aufruf (Create) zu setzen und das finally vor das Free. Der Finally-Abschnitt wird auf jeden Fall abgearbeitet - auch wenn im Try-Abschnitt davor per Exit die Routine verlassen wurde.
Was soll ich jetzt glauben bzw. warum brauch ich nach eurer meinung create nicht zu schützen? Dabei kann doch auch ein fehler auftreten.
Danke,
Borti

mytar 11. Aug 2004 11:10

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

Borti 11. Aug 2004 11:27

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 21:26 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