2010-12-15 54 views
2

J'ai un formulaire Web qui accepte un login utilisateur - mot de passe, email. J'appelle ensuite une classe d'autorisation qui teste les champs, en jetant une exception le cas échéant. Ma question est: Dans mon code derrière la page, comment dois-je gérer/consommer ces exceptions?Comment puis-je gérer les exceptions lancées par une autre classe?

classe autorisation - propriété Email

 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

behind - une sorte de chèque

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

À ce stade, je ne sais pas ce que je suis censé faire avec les exceptions l'autorisation classe génère.

+0

Minor nit, votre 'ArgumentException' a le message et le nom du paramètre en arrière. – user7116

+0

Ne devrait-il pas être un paramètre, un message? – hoakey

+0

Confusément, 'ArgumentNullException' prend' parameter' puis 'message'. 'ArgumentException' prend' message' puis 'parameter'. Veuillez lire la documentation MSDN pour plus d'informations. – user7116

Répondre

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

Vous ne devriez pas besoin de prendre un ArgumentException - qui est une sorte d'exception qui est une erreur de programmation, pas une exception à l'exécution. (Le code doit lancer une FormatException si l'entrée de l'utilisateur est invalide, par exemple.)

+0

C'est intéressant. Je n'ai pas réalisé cela. Merci. – hoakey

+0

Le seul scénario que j'imagine où il est valide de le faire est si le code que vous appelez incorrectement utilise ces exceptions et c'est hors de votre contrôle; dans ce cas, je ferais moi-même un try-catch pour attraper l'ArgumentException, relancer une autre FormatException (ou une autre sorte), et attraper cela à l'extérieur du corps où il doit être, afin de ne pas casser le design avec le reste du code. (L'efficacité n'est pas un problème, car les exceptions sont toujours inefficaces de toute façon.) – Mehrdad

+0

Cela peut sembler terrible, mais - Si j'utilise une prise d'essai dans la classe d'appel qui traite des ArgumentExceptions lancés par la classe d'autorisation, ce qui est le point de changer pour FormatException si elle fonctionne bien avec ArgumentExceptions? – hoakey

3

Vous devriez faire aussi la validation côté client que les champs txtUserName.Text et txtPassword.Text ne sont pas vides. Pour les exceptions, vous devez avoir un gestionnaire global qui fournit un message d'erreur gentil à l'utilisateur si une exception est levée (c'est-à-dire si la validation côté client n'a pas réussi à attraper quelque chose et le serveur a jeté une exception). Vous ne devriez pas avoir besoin d'intercepter des exceptions individuelles sur le client.

+0

Est-ce que ce serait quelque chose dans le code qui expose mes exceptions? – hoakey

1

Vous auriez besoin quelque chose comme ceci:

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 
} 

Vous devez attraper tous les types d'exception que vous jetez (ou attraper juste Exception).

+0

Ne pourrais-je pas utiliser les exceptions générées dans la classe d'autorisation? – hoakey

+1

que voulez-vous dire? toutes les exceptions lancées par la classe d'autorisation lorsque auth.Login est appelée seront interceptées par le bloc ci-dessus. Cependant, si vous appelez auth.Login à plusieurs endroits, vous aurez besoin du même bloc plusieurs fois pour avoir la même sortie. Si vous avez un try/catch qui gère les exceptions pour l'ensemble de l'application, vous pouvez lancer des exceptions où vous voulez et ensuite try/catch les affichera de la même manière, quoi qu'il arrive. – zsalzbank

+0

Avoir une tentative d'essai pour l'application entière puis sonne la voie à suivre. Comment cela fonctionnerait-il réellement? Y aurait-il une tentative d'attraper avec une classe à part? – hoakey

1

Généralement, votre application doit réagir à ces exceptions car elles représentent un état spécifique. Réagir pourrait consister à signaler (consigner) les exceptions le cas échéant, rediriger l'utilisateur vers une page d'erreur ou fournir une réponse liée au contexte de l'exception (par exemple, est-ce une exception en raison de données d'entrée non valides? messages d'erreur, etc.).

+0

Dans la classe d'autorisation, c'est ce que j'ai voulu faire. C'est comment je puis bulle ces exceptions jusqu'à la classe appelante par exemple. le formulaire Web, et en faire usage. – hoakey

1

J'ouvrirais publiquement IsValidEmail et ferais une vérification avant d'appeler la méthode de connexion. Ensuite, vous pourriez présenter l'erreur avant la soumission.