AGB  ·  Datenschutz  ·  Impressum  







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

Exceptions schachteln

Ein Thema von Hansa · begonnen am 13. Jan 2004 · letzter Beitrag vom 14. Jan 2004
Antwort Antwort
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

Exceptions schachteln

  Alt 13. Jan 2004, 12:23
Hi,

wie kriege ich es hin, Delphi dazu zu bringen, daß er nach einer falschen Passwort Eingabe eine Fehlermeldung bringt und danach eine Korrektur zuläßt ?

Delphi-Quellcode:
with pFIBBackupService1 do begin
    weiter := false;
    repeat
      try
        ServerName := ServerE.Text;
        LoginPrompt := False;
        Params.Add('user_name='+UserE.Text);
        Params.Add('password='+PasswordE.Text);
        Active := True;
        weiter := true;
      except
        showmessage ('KEINE ZUGRIFFSRECHTE !');
        Params.Add('user_name='+UserE.Text);
        Params.Clear;
        PasswordE.Text := '';
        PasswordE.SetFocus;
        weiter := false;
      end;
showmessage ('ÜÜÜ');
    until weiter;
Mit dem Code erzeuge ich nur beim einmaligen falschen eingeben eine Endlosschleife. Bis zu den ÜÜÜ komme ich, aber dann nur noch in den except-Teil.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Smokey
Smokey

Registriert seit: 10. Nov 2003
Ort: Puerto de la Cruz
158 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Exceptions schachteln

  Alt 13. Jan 2004, 12:32
Nunja dein ansatz ist falsch.
Wenn du das in eine Schleife packst, ist ja klar, dass er immer wieder in den Except Teil geht.
Du gibst dem Programm bzw. dem Anwender ja keine Chance eine neue Eingabe ins Textfeld zu machen.

Pack deinen Code ohne die Schleife in eine Funktion zB TryConnect() und ruf sie auf wenn die Eingabe im Textfeld fertig ist (hast doch bestimmt nen Connect Button oder so).

Auf alle fälle muss die schleife da weg

Was bei dir passiert ist :

1. Falsches Passwort
2. Passwort im Passwort-Textfeld wird gelöscht
3. Sprung zum Schleifenanfang
4. Versuch des Logins mit aktuellem, also leerem Passwort aus Passworttext
5. siehe 1.
Greif dir ein gutes Stück Fleisch auf deinem Weg nach draussen !!!
  Mit Zitat antworten Zitat
Minz

Registriert seit: 19. Dez 2002
476 Beiträge
 
#3

Re: Exceptions schachteln

  Alt 13. Jan 2004, 12:32
Delphi-Quellcode:
try
  result:=false;
  try
    Passwort prüfen;
    if Passwort=falsch then
       raise exception.create('Falsch');
    else result:=true;
  except end;
except
  erneute Passworteingabe;
end;
Vielleicht hilft das
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#4

Re: Exceptions schachteln

  Alt 13. Jan 2004, 12:44
Hallo Hansa,

generell solltest Du Exceptions nicht für den Programmfluss einsetzen, wenn es auch anders geht. Konstrukte der Art
Delphi-Quellcode:
try
  Result:= APositivInt div AnotherPositivInt;
except
  on EDivideByZero do
    Result:= IntInifinity;
end;
sind aus verschiedenen Gründen gegenüber der Lösung
Delphi-Quellcode:
if AnotherPositivInt=0 then
  Result:= IntInifinity
else
  Result:= APositivInt div AnotherPositivInt;
zu verwerfen!

Falls Du also die Möglichkeit hast, die Gültigkeit des Passworts auch ohne eine potenzielle Exception zu überprüfen, solltest Du etwas der in Art
Delphi-Quellcode:
if not ValidPassword(myPassword) then
  repeat
    myPassword:= AlertInvalidAndReEnterPassword;
  until ValidPassord(myPassord);
vorziehen.

Sollten Exceptions unumgänglich sein, könntest Du es mit etwas der Art
Delphi-Quellcode:
myValidPassword:= False;
repeat
  try
    TryToUsePassword(myPassword);
    myValidPassword:= True;
  except
    on EInvalidPassword do
      myPassword:= AlertInvalidAndReEnterPassword;
  end;
until bValidPassword;
versuchen.

Versuche nicht, im except-Block alle Exceptions abzufangen. Bei einer solchen Lösung könntest Du bei dieser Form von Schleifen und unbedachten Fehlern, die zB bei der Darstellung auftreten, ungewollt Endlosschleifen produzieren.
Darüber hinaus solltest Du eine Lösung finden, mit der ein Benutzer die Schleife beenden kann, falls er sein Passwort vergessen hat...
gruß, choose
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: Exceptions schachteln

  Alt 14. Jan 2004, 12:37
Mein Programm weiß ja gar nichts von dem Passwort ! Das ist in der Datenbank abgespeichert. Ist auch gut so für Disassemblierer oder sonstige dunkle Gestalten. Ich muß also so oder so eine Exception abfangen. Habe es jetzt so ähnlich wie Minz gemacht:

Delphi-Quellcode:
  with pFIBBackupService1 do begin
    try
      ServerName := ServerE.Text;
      LoginPrompt := False;
      Params.Add('user_name='+UserE.Text);
      Params.Add('password='+PasswordE.Text);
      Active := True;
      weiter := true
    except
      raise exception.create('KEINE ZUGRIFFSRECHTE');
    end;
Ja und die Schleife ist auch weg. 8)
Gruß
Hansa
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#6

Re: Exceptions schachteln

  Alt 14. Jan 2004, 13:06
Zitat von Hansa:
Mein Programm weiß ja gar nichts von dem Passwort ! Das ist in der Datenbank abgespeichert. [..]Ich muß also so oder so eine Exception abfangen.
Ich glaube, hier haben wir aneinander vorbeigeredet. Im Fall eines Dateizugriffs "weiß" Dein Programm auch nicht, ob die Datei existiert oder nicht, trotzdem ist ein Konstrukt
Delphi-Quellcode:
if FileExists(AFileName) then
    DoSomeFileAction(AFileName);
der Möglichkeit
Delphi-Quellcode:
try
  DoSomeFileAction(AFileName);
except
  on IOException do
    SomeRecoveryCode;
end;
vorzuziehen (obgleich ein ähnlicher Try..Except-Block auch in der ersten Variante eingesetzt werden sollte, um Probleme mit nebenläufigen Zugriffen abzufangen).

Wenn ich Deinen Code richtig interpretiere, "übersetzt" Du lediglich eine Exception in eine andere, statt eine gezielte Meldung auszugeben (dank des stdWrappers wird diese letztlich auf eine Meldung gemappt) oder andere passende Aktionen (Focus setzen, Passwort wieder leeren, etc.) durchzuführen.

Zitat von Hansa:
Ja und die Schleife ist auch weg. 8)
Aber war nicht genau das Deine Forderung? Eine wiederholte Eingabemöglichkeit?


Es freut mich trotzdem, dass Dein Problem nun gelöst ist.
gruß, choose
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Exceptions schachteln

  Alt 14. Jan 2004, 13:33
Zu früh gefreut. 8) Das stimmt, es könnte ja gar keine Datei vorhanden sein ! Das wollte ich jetzt so lösen:

Delphi-Quellcode:
  with pFIBBackupService1 do begin
    try
      ServerName := ServerE.Text;
      LoginPrompt := False;
      Params.Add('user_name='+UserE.Text);
      Params.Add('password='+PasswordE.Text);
      Active := True;
    except
      raise exception.create('KEINE ZUGRIFFSRECHTE !!!');
    end;
    if FileExists (DBNameE.Text) then begin
      Verbose := True;
      Options := [NonTransportable, IgnoreLimbo];
      DatabaseName := DBNameE.Text;
  showmessage (DBNameE.Text);
      BackupFile.Clear;
      BackupFile.Add(BackupE.Text);
      ServiceStart;
      Active := False;
      ShowMessage ('Datensicherung beendet !');
    end
    else begin
      showmessage ('KEINE DATEN ZUM SICHERN !!!');
      active := true;
    end;
Die Fehlermeldung kommt schon richtig. Aber wenn ich den Namen korrigiere lande ich bei "KEINE ZUGRIFFSRECHNUNG".
Gruß
Hansa
  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 05:09 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