![]() |
Exceptions schachteln
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:
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.
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; |
Re: Exceptions schachteln
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 :-D 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. |
Re: Exceptions schachteln
Delphi-Quellcode:
Vielleicht hilft das
try
result:=false; try Passwort prüfen; if Passwort=falsch then raise exception.create('Falsch'); else result:=true; except end; except erneute Passworteingabe; end; |
Re: Exceptions schachteln
Hallo Hansa,
generell solltest Du Exceptions nicht für den Programmfluss einsetzen, wenn es auch anders geht. Konstrukte der Art
Delphi-Quellcode:
sind aus verschiedenen Gründen gegenüber der Lösung
try
Result:= APositivInt div AnotherPositivInt; except on EDivideByZero do Result:= IntInifinity; end;
Delphi-Quellcode:
zu verwerfen!
if AnotherPositivInt=0 then
Result:= IntInifinity else Result:= APositivInt div AnotherPositivInt; 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:
vorziehen.
if not ValidPassword(myPassword) then
repeat myPassword:= AlertInvalidAndReEnterPassword; until ValidPassord(myPassord); Sollten Exceptions unumgänglich sein, könntest Du es mit etwas der Art
Delphi-Quellcode:
versuchen.
myValidPassword:= False;
repeat try TryToUsePassword(myPassword); myValidPassword:= True; except on EInvalidPassword do myPassword:= AlertInvalidAndReEnterPassword; end; until bValidPassword; 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... |
Re: Exceptions schachteln
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. :mrgreen: Ich muß also so oder so eine Exception abfangen. Habe es jetzt so ähnlich wie Minz gemacht:
Delphi-Quellcode:
Ja und die Schleife ist auch weg. 8)
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; |
Re: Exceptions schachteln
Zitat:
Delphi-Quellcode:
der Möglichkeit
if FileExists(AFileName) then
DoSomeFileAction(AFileName);
Delphi-Quellcode:
vorzuziehen (obgleich ein ähnlicher Try..Except-Block auch in der ersten Variante eingesetzt werden sollte, um Probleme mit nebenläufigen Zugriffen abzufangen).
try
DoSomeFileAction(AFileName); except on IOException do SomeRecoveryCode; end; 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:
Es freut mich trotzdem, dass Dein Problem nun gelöst ist. :) |
Re: Exceptions schachteln
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:
Die Fehlermeldung kommt schon richtig. Aber wenn ich den Namen korrigiere lande ich bei "KEINE ZUGRIFFSRECHNUNG". :mrgreen:
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 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