AGB  ·  Datenschutz  ·  Impressum  







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

Allgemeines zun Exceptions

Ein Thema von Borti · begonnen am 5. Aug 2004 · letzter Beitrag vom 11. Aug 2004
Antwort Antwort
Borti

Registriert seit: 11. Okt 2003
151 Beiträge
 
#1

Allgemeines zun Exceptions

  Alt 5. Aug 2004, 09:32
Guten Morgen,
Inzwischen hat sich bei mir eine ganze Reihe Fragen zum Thema Exceptions 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
Ich hab's versucht
(auch wenn's nicht so aus sieht)
  Mit Zitat antworten Zitat
Brüggendiek

Registriert seit: 13. Dez 2002
Ort: Dortmund
275 Beiträge
 
Delphi 5 Standard
 
#2

Re: Allgemeines zun Exceptions

  Alt 5. Aug 2004, 22:06
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

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
Dietmar Brüggendiek
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Allgemeines zun Exceptions

  Alt 6. Aug 2004, 07:59
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.
Andreas
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#4

Re: Allgemeines zun Exceptions

  Alt 6. Aug 2004, 10:06
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
Francis Obikwelu
  Mit Zitat antworten Zitat
Borti

Registriert seit: 11. Okt 2003
151 Beiträge
 
#5

Re: Allgemeines zun Exceptions

  Alt 6. Aug 2004, 10:49
Zitat:
Ich würde dir mal das Exception - Tutorial auf Delphi-Source.de empfehlen.
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?
gruß,
Borti
Ich hab's versucht
(auch wenn's nicht so aus sieht)
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: Allgemeines zun Exceptions

  Alt 8. Aug 2004, 18:27
Hallo Borti,

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?
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
Francis Obikwelu
  Mit Zitat antworten Zitat
Borti

Registriert seit: 11. Okt 2003
151 Beiträge
 
#7

Re: Allgemeines zun Exceptions

  Alt 11. Aug 2004, 10:58
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
Ich hab's versucht
(auch wenn's nicht so aus sieht)
  Mit Zitat antworten Zitat
mytar

Registriert seit: 30. Mai 2004
Ort: Zermatt
411 Beiträge
 
Delphi 6 Enterprise
 
#8

Re: Allgemeines zun Exceptions

  Alt 11. Aug 2004, 11:10
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
Francis Obikwelu
  Mit Zitat antworten Zitat
Borti

Registriert seit: 11. Okt 2003
151 Beiträge
 
#9

Re: Allgemeines zun Exceptions

  Alt 11. Aug 2004, 11:27
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
Ich hab's versucht
(auch wenn's nicht so aus sieht)
  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 06:03 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