Question

J'ai le code suivant dans une classe de la mienne. Le but de cette classe est d’obtenir le solde d’un serveur Web. Juste au cas où quelque chose ne va pas avec la balance. Je vais gérer une exception. Cependant, tout cela est facile à faire. Mais je reste à me demander ce que je retourne dans ma déclaration de capture.

La plupart des exemples que j'ai consultés se contentent d'écrire sur la console en utilisant:

Console.WriteLine(ex.Message);

C'est très bien. Mais dans une application réelle, que font la plupart des développeurs?

 //Download only when the webclient is not busy.
        if (!wc.IsBusy)
        { 
            // Sleep for 1/2 second to give the server time to update the balance.
            System.Threading.Thread.Sleep(500);

            try
            {
                // Download the current balance.
                wc.DownloadStringAsync(new Uri(strURL));
            }
            catch (WebException ex)
            {
                Console.Write("GetBalance(): " + ex.Message);
            }
        }
        else
        {
            Console.Write("Busy please try again");
        }

Ma fonction pour le moment revient à vide. Et je me demande simplement quoi d’autre je reviendrais si le client Web était occupé?

Merci beaucoup pour vos conseils,

Était-ce utile?

La solution

Ne capturez pas une exception si vous ne pouvez pas la gérer. Si vous ne renvoyez qu'une valeur, la méthode d'appel doit vérifier si la valeur est un résultat réel ou est simplement un indicateur d'une exception. Et maintenant, cette méthode doit décider quoi faire et revenir. Et la méthode appelant cette méthode. Et la méthode ...

Donc, laissez l’exception bouger la pile et attrapez-la quelque part où vous pourrez la gérer. Peut-être directement sous l'interface utilisateur, puis affichez une boîte de message demandant à l'utilisateur si vous souhaitez réessayer ou affichez des informations sur la façon de résoudre le problème. Si vous n'avez pas d'interface utilisateur, attrapez-le à un endroit où vous pouvez résoudre le problème et réessayez. S'il s'agit d'un problème temporaire, relancez la tâche dans son intégralité à un niveau raisonnable jusqu'à ce que l'appel aboutisse.

Si vous souhaitez enregistrer quelque chose, utilisez le modèle suivant pour enregistrer l'exception et la renvoyer.

try
{
   DoStuff();
}
catch (Exception exception)
{
   Log(exception.ToString());

   throw;
}

Notez qu'il s'agit de throw; et non de throw exception; . Si vous procédez plus tard, vous perdez la trace de pile d'origine. Si vous pouvez déduire plus de détails sur la cause de l'exception, vous devez envelopper l'exception capturée dans une exception plus significative, avec des informations supplémentaires.

try
{
   DoStuff();
}
catch (SpecificMeaninglessException exception)
{
   Log(exception.ToString());

   throw new MeaningfulException("Details about the error.", exception);
}
catch (Exception exception)
{
   Log(exception.ToString());

   throw;
}

Autres conseils

Vous devriez utiliser la méthode ex.ToString ()

  

Message d'exception   contient une description simple de l'exception (par exemple, "Référence d'objet non définie ...").

     

Exception.ToString ()   contient une description de l'exception ainsi qu'une trace complète de la pile.

Gestion des exceptions dans les meilleures pratiques .NET

Vous pouvez réexécuter la méthode si le client est occupé mais attendez un certain temps avant de réessayer. Potentiellement avec un échec après x tentatives,

.

Si, au lieu de cela, vous souhaitez poursuivre et enregistrer simplement le problème, votre instruction catch peut consigner l'exception dans un journal basé sur des fichiers, un visualiseur d'événements, l'envoyer dans une base de données, déclencher une alerte (email, sms, etc.). est nécessaire.

Dépend de la gravité de l'exception.

Je suggérerais de rechercher le bloc d'exception de Patterns & amp; Pratiques

Si vous ne souhaitez voir que l'exception, vous devez la rejeter afin que ceux qui envisagent de la gérer l'obtiennent toujours.

Vous ne voulez certainement pas masquer une exception non gérée. Laissez cette bulle remonter à travers la pile. Mais si vous demandez quoi retourner si le client Web est occupé, que diriez-vous de renvoyer un intervalle aléatoire ou un intervalle significatif que l'appelant de la fonction doit attendre avant de tenter de télécharger à nouveau la balance? Un nombre aléatoire pourrait répartir la charge ou atténuer d'un problème de collision. Un intervalle plus significatif pourrait être renvoyé en fonction de l'état actuel du serveur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top