2010-12-15 3 views
2

Ich habe ein Webformular, das eine Benutzeranmeldung akzeptiert - Passwort, E-Mail. Ich rufe dann eine Berechtigungsklasse auf, die die Felder testet und gegebenenfalls eine Ausnahme auslöst. Meine Frage ist: Wie soll ich diese Ausnahmen in meinem Code hinter der Seite verwalten/konsumieren?Wie verwalte ich Ausnahmen, die von einer anderen Klasse ausgelöst wurden

Berechtigungsklasse - E-Mail-Eigenschaft

 public string Email 
    { 
     get { return _email; } 
     set 
     { 
      if (value == null) 
       throw new ArgumentNullException("Email", "The email address is null"); 
      if (value == string.Empty) 
       throw new ArgumentException("Email", "No email has been entered"); 
      if (!IsValidEmail(value)) 
       throw new ArgumentException("Email", "This is an invalid email address"); 
      _email = value; 
     } 
    } 

-Code hinter Seite - eine Art Scheck

if (auth.Login(txtUsername.Text, txtPassword.Text) == true) //or whatever the invokation might be 
// do somehting with exceptions??? 

Ich habe an dieser Stelle keine Ahnung, was ich soll mit den Ausnahmen, die Ermächtigung tun Klasse generiert.

+0

Minor nit, Ihre'ArgumentException' hat den Nachrichten- und Parameternamen rückwärts. – user7116

+0

Sollte es nicht Parameter, Nachricht sein? – hoakey

+0

Verwirrenderweise genug, 'ArgumentNullException' nimmt' Parameter' dann 'Nachricht'. 'ArgumentException' nimmt' Nachricht' und dann 'Parameter'. Bitte lesen Sie die MSDN-Dokumentation für weitere Informationen. – user7116

Antwort

1
try 
{ 
    auth.Login(txtUsername.Text, txtPassword.Text); 
} 
catch (ArgumentException e) 
{ 
    //Handle Exception here 
    MessageBox.Show(e.ToString(), "EMail invalid"); 
} 
1

Sie sollen keine ArgumentException fangen müssen - das ist eine Art von Ausnahme, dass ein Programmierfehler ist, keine Laufzeitausnahme. (Der Code sollte ein FormatException werfen, wenn die Eingabe des Benutzers ungültig ist, zum Beispiel.)

+0

Das ist interessant. Habe das nicht bemerkt. Vielen Dank. – hoakey

+0

Das einzige Szenario, das ich mir vorstellen würde, wo es gültig ist, ist, wenn der Code, den Sie aufrufen, diese Ausnahmen falsch verwendet und es außerhalb Ihrer Kontrolle liegt; In diesem Fall würde ich einen try-catch machen, um die ArgumentException zu erfassen, eine andere FormatException (oder eine andere Art) erneut zu werfen und diese außerhalb des Körpers zu fangen, wo immer sie sein muss, um das Design nicht zu unterbrechen der Rest des Codes. (Effizienz ist kein Thema, denn Ausnahmen sind sowieso immer ineffizient.) – Mehrdad

+0

Das mag schrecklich klingen, aber - Wenn ich einen try catch in der aufrufenden Klasse verwende, die sich mit den ArgumentExceptions beschäftigt, die von der Berechtigungsklasse geworfen werden, was ändert sich dann in FormatException, wenn es mit ArgumentExceptions funktioniert? – hoakey

3

Sie sollten auch die clientseitige Validierung tun, dass die txtUserName.Text und txtPassword.Text Felder nicht leer ist.

Für die Ausnahmen sollten Sie einen globalen Handler haben, der dem Benutzer eine nette Fehlermeldung bietet, wenn eine Ausnahme ausgelöst wird (dh wenn die clientseitige Validierung fehlgeschlagen ist und der Server eine Ausnahme ausgelöst hat). Sie sollten keine individuellen Ausnahmen auf dem Client abfangen müssen.

+0

Also wäre das etwas im Code dahinter, der meine Ausnahmen aufdeckt? – hoakey

1

Sie würden so etwas wie dieses brauchen:

try { 
    auth.Login(txtUsername.Text, txtPassword.Text); 
}catch(ArgumentNullException anex){ 
    //output the message to the user 
}catch(ArgumentException aex){ 
    //output the message to the user 
} 

Sie müssten jede Art von Ausnahme fangen, die Sie (oder fangen gerade Exception) werfen.

+0

Kann ich die in der Berechtigungsklasse generierten Ausnahmen nicht verwenden? – hoakey

+1

was meinst du? Alle Ausnahmen, die von der Autorisierungsklasse beim Aufruf von auth.Login ausgelöst werden, werden vom obigen Block abgefangen. Wenn Sie jedoch auth.Login an vielen Stellen aufrufen, benötigen Sie denselben Block mehrmals, um die gleiche Ausgabe zu erhalten. Wenn Sie einen try/catch haben, der Ausnahmen für die gesamte Anwendung behandelt, können Sie Exceptions auslösen, wo immer Sie wollen, und dann wird try/catch sie auf die gleiche Weise anzeigen, egal was passiert. – zsalzbank

+0

Wenn Sie versuchen, die gesamte App zu fangen, dann klingt das nach vorne. Wie würde das eigentlich funktionieren? Würde es einen Versuch mit einer eigenen Klasse geben? – hoakey

1

Normalerweise muss Ihre Anwendung auf diese Ausnahmen reagieren, da sie einen bestimmten Status darstellen. Reagieren könnte die Ausnahmen melden (protokollieren), den Benutzer auf eine Fehlerseite umleiten oder eine Antwort geben, die sich auf den Kontext der Ausnahme bezieht (z. B. ist dies eine Ausnahme wegen ungültiger Eingabedaten, wenn ja, zeige das Formular mit an Fehlermeldungen usw.).

+0

In der Berechtigungsklasse habe ich das so gemacht. Es ist, wie ich dann diese Ausnahmen bis zur aufrufenden Klasse sprudeln lasse, z.B. das Webformular, und nutzen Sie sie. – hoakey

1

Ich würde IsValidEmail öffentlich zugänglich machen und eine Überprüfung vor dem Aufruf der Login-Methode haben. Dann könnten Sie den Fehler vor der Einreichung präsentieren.

Verwandte Themen