AGB  ·  Datenschutz  ·  Impressum  







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

Exception Handling.

Ein Thema von Luckie · begonnen am 1. Jun 2004 · letzter Beitrag vom 30. Jul 2005
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Exception Handling.

  Alt 1. Jun 2004, 01:53
Ich habe mir gerade mal etwas Gedanken über Exceptions gemacht und wie man einen Code wasserdicht bekommt. Dies ist mein Ergebnis:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  TEXT = 'Dies ist ein Testtext.';
  FILENAME = 'c:\test.txt';
var
  fs: TFileStream;
  s: String;
begin
  s := TEXT;
  try {1}
    fs := TFileStream.Create(FILENAME, fmCreate);
    try {2}
      try {3}
        fs.WriteBuffer(Pointer(s)^, length(s));
      except
        on E: EWriteError do ShowMessage(E.Message);
      end;
    finally
      FreeAndNil(fs);
    end;
  except
    on E: Exception do ShowMessage(E.Message);
  end;
end;
Jetzt frage ich mich, das ist doch der blanke Wahnsinn: Drei verschachtelte try-Blöcke!

{1}: Um die Exception abzufangen, wenn die Methode Create von TFileStream fehlschlägt. Hier bringe ich zwar auch nur die Fehlermeldung, die die Exception selber bringen würde, aber eventuell will man ja noch was anders machen.
{2}: Der obligatorische Ressourcenschutzblock.
{3}: Um die Exception abzufangen, die WriteBuffer auslöst, wenn was schief geht beim Schreiben.

Ist das denn normal oder übertreibe ich hier? Wie gesagt, meine ShowMessages steh da nur für alternativen Code. Das heißt will man anstatt den ShowMessages noch was anderes machen, dann müssen drei try-Blöcke sein - oder?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#2

Re: Exception Handling.

  Alt 1. Jun 2004, 02:29
Delphi-Quellcode:
  TEXT = 'Dies ist ein Testtext.';
  FILENAME = 'c:\test.txt';
var
  fs: TFileStream;
  s: String;
begin
  s := TEXT;
  try
    fs := TFileStream.Create(FILENAME, fmCreate);
    try
      fs.WriteBuffer(Pointer(s)^, length(s));
    finally
      FreeAndNil(fs);
    end;
  except
    on E: EWriteError do ShowMessage(E.Message) else
      on E: Exception do ShowMessage(E.Message);
  end;
end;
Dürfte das gleiche machen. Im Grunde sollte man pro Procedure mit einem try finally und einem try except auskommen können.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Exception Handling.

  Alt 1. Jun 2004, 02:40
Hm. Gut. Sollte klappen.

Machen wir mal etwas weiter. Folgender Code:
Delphi-Quellcode:
type
  EInvalidPW = class(Exception);

const
  PASSWORD = 'test';

procedure CheckPWD(Pwd: String);
resourcestring
  rsInvalidPw = 'Ungültiges Passwort';
begin
  if Pwd <> PASSWORD then
    raise EInvalidPW.Create(rsInvalidPw);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    CheckPWD('tset');
  except
    on E: EInvalidPW do ShowMessage(E.Message);
  end;
end;
Einfaches Beispiel, aber man sieht deutlich eine Funktion die True oder False zurück gibt hätte es auch getan. Wo liegt konkret der Vorteil von Exceptions? Oder anders gefragt, wann ist das werfen von Exceptions sinnvoll?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Exception Handling.

  Alt 1. Jun 2004, 03:41
Ganz genau das wollte ich mal meine Profs fragen. Der einzige Grund, den ich mir vorstellen kann, ist dass wenn eine Ausnahmesituation NICHT vom Programmierer behandelt wird, so stürzt der Rechner zumindest nicht ab, sondern es wird statt dessen eine unbehandelte Exception ausgelöst und angezeigt.

Wenn man aber sauber programmiert, dann kann man sich doch aber den ganzen (wie ich finde schwachsinnigen) Overhead sparen, gell!? OOP hin oder her... FEHLER müssen doch nicht unbedingt AUCH Objekte sein
Finde Exceptions im wesentlichen genau so birnig wie das Geheimnisprinzip. Was soll ich erst einen Methodcall auslösen, wenn ich doch DIREKT und SCHNELL zugreifen könnte!? Das ist in meinen Augen völlig unnötige "Theorisierung" - zwanghaftes Anpassen an ein theroetisches Konzept. OOP ist SUPER! Keine Frage. Aber man muss es doch nicht auf Biegen und Brechen bis in alle Nieschen reinzwängen wollen...

Danke Luckie! Bin ich doch nicht ganz so alleine mit meinem Gefühl


gruss,
dizzy
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Exception Handling.

  Alt 1. Jun 2004, 03:44
Nun ja, ich habe da eigentlich kein Gefühl, da ich weniger mit dem Bauch als mehr mit meinem Kopf - zu mindest versuche ich es - programmiere, deswegen frage ich hier.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von c113plpbr
c113plpbr

Registriert seit: 18. Nov 2003
Ort: localhost
674 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Exception Handling.

  Alt 1. Jun 2004, 10:24
Ähnliches passiert mir auch öfter ... irgendwann bin ich dann dazu übergegangen machen functions selbst zu schreiben, und keine 'Unhandled Exception' auszulösen, sondern die Fehlerbehandlung vor Ort durchzuführen.

Am beispiel von StrToInt:
Delphi-Quellcode:
function StrToInt_(const S: string; out E : boolean) : integer;
var
  x : integer;
begin
  Val(S, result, x);
  E := x <> 0;
end;
Wenn die (ausgegebene) Variable E true ist, dann gab es keinen Fehler, wenn nicht, gab es einen. So hat man zwar ne if-Abfrage mehr, aber man könnte so mehrere konvertierungen zusammennehmen, und dann checken, ob es irgendwo nen fehler gab.
Diese Methode ist zwar umständlich, aber manchmal hilfreich.

ciao, Philipp
Philipp
There is never enough time to do all the nothing you want.
*HABENWILL*
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Exception Handling.

  Alt 1. Jun 2004, 10:28
Zitat von c113plpbr:
Ähnliches passiert mir auch öfter ... irgendwann bin ich dann dazu übergegangen machen functions selbst zu schreiben, und keine 'Unhandled Exception' auszulösen, sondern die Fehlerbehandlung vor Ort durchzuführen.

Am beispiel von StrToInt:
Delphi-Quellcode:
function StrToInt_(const S: string; out E : boolean) : integer;
var
  x : integer;
begin
  Val(S, result, x);
  E := x <> 0;
end;
Wenn die (ausgegebene) Variable E true ist, dann gab es keinen Fehler, wenn nicht, gab es einen. So hat man zwar ne if-Abfrage mehr, aber man könnte so mehrere konvertierungen zusammennehmen, und dann checken, ob es irgendwo nen fehler gab.
Diese Methode ist zwar umständlich, aber manchmal hilfreich.

ciao, Philipp
Hi,

oder du benutzt die eingebaute Funktion TryStrToInt von Delphi

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8

Re: Exception Handling.

  Alt 1. Jun 2004, 10:34
Ist die neu? Oder meinst du die, an die ich denke: "StrToIntDef".
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Exception Handling.

  Alt 1. Jun 2004, 10:35
Zitat von MathiasSimmack:
Ist die neu? Oder meinst du die, an die ich denke: "StrToIntDef".
Hi,

ja, anscheinend ist die neu in Delphi 6 (oder erst 7?).

Code:
function TryStrToInt(const S: string; out Value: Integer): Boolean;

Beschreibung

TryStrToInt konvertiert den String S, der ein Integer repräsentiert (in dezimaler oder hexadezimaler Form), in eine Zahl und weist diese Value zu. Wenn S keine gültige Zahl enthält, gibt TryStrToInt false zurück; ansonsten true.
Edit: Verflixte Tags

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Exception Handling.

  Alt 1. Jun 2004, 10:47
Könnten wir bitte beim Thema bleiben? Danke.

@Hagen: Was mir gerade bei deinem Code einfällt: Wenn das Schreiben eine Exception auslöst, wird dann auch das Objekt wieder freigegeben? Um das nämlich sicher zustellen, habe ich es nämlich so geschachtelt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 16:40 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