3 votes

Modèles de conception pour le traitement des exceptions

Je suis en train d'écrire une classe de bibliothèque qui pourrait être utilisée par plusieurs classes. Je simplifie l'exemple afin d'illustrer mon propos. Disons que j'ai trois classes : A, B et C :

public class B
{
  public static string B_Method()
  {
    string bstr = String.Empty;

    try
       {

        //Do Something

       }

    catch
        {

        //Do Something

        }

  return bstr;

}

B est la classe de bibliothèque que je suis en train d'écrire. Il y a maintenant deux autres classes, disons A et C :

public class A
{
  public void A_Method()
  {
   string astr = B.B_Method();
  }

}

public class C
{
 public void C_Method()
  {
   string cstr = B.B_Method();
  }

}

La question porte sur la gestion des exceptions. Je souhaite que les méthodes respectives des deux classes A et B gèrent l'exception survenant dans B_Method de manière différente.

J'ai cherché un modèle de conception de cadre, mais j'ai eu l'impression qu'il n'était pas utile.

9voto

Fredrik Mörk Points 85694

L'approche que je suis habituellement est la suivante :

  • Si ma méthode peut faire quelque chose d'utile avec l'exception, je l'attrape et je le fais.
  • Si ce n'est pas le cas, je ne l'attrape pas et je laisse le code d'appel s'en charger.

Les seuls endroits où je mettrais un bloc "catch all" sont les points d'entrée dans le code de l'interface utilisateur (comme les gestionnaires d'événements pour les clics sur les boutons et autres), car ne pas attraper les exceptions à cet endroit pourrait ralentir le processus.

Cela signifie également que les clauses d'exception doivent attraper les exceptions spécifiques que vous pouvez gérer.

Une approche que je vois parfois consiste à attraper l'exception, à l'envelopper dans un nouveau type d'exception et à la lancer. Bien que cela offre une certaine traçabilité, j'ai également l'impression que cela supprime certaines options dans la gestion des exceptions dans le code d'appel, comme avoir des clauses de capture spécifiques pour différents scénarios. Dans ces cas, vous devrez plutôt avoir des clauses if qui inspectent l'exception interne, ce qui est moins lisible à mes yeux.

1voto

Azodious Points 8187

B est la classe de bibliothèque que je suis en train d'écrire.

Si vous avez le contrôle sur B code, B devrait re throw l'exception détectée :

public class B
{
    public static string B_Method()
    {
        string bstr = String.Empty;

        try
        {
            // Do Something
        }
        catch(Exception e)
        {
            // Do Something (Log the exception details)
            throw;
        }

        return bstr;
    }
}

Je souhaite que les méthodes respectives des deux classes A et B traitent l'exception survenant dans B_Method de manière différente.

Aujourd'hui, B peut enregistrer l'exception et A y C peuvent gérer l'exception rejetée à leur manière.

0voto

margabit Points 2934

Vous pouvez relancer ou simplement laisser lancer l'exception dans B_Method et l'attraper dans les classes A et C.

public class A
{
  public void A_Method()
  {
   try
   {
     string astr = B.B_Method();
   }
  catch(Exception ex)
  {
    //Handle it in A way
  }

}

public class C
{
 public void C_Method()
  {
   try
   {
     string astr = B.B_Method();
   }
  catch(Exception ex)
  {
    //Handle it in C way
  }
}

Je pense que les Design Patterns ne s'appliquent pas vraiment ici Il s'agit simplement de programmation OO.

0voto

elex Points 66

Supprimer le bloc try et catch de la classe b

public static string B_Method()throws Exception{
    boolean success=compute();
    if(!success){
       throw new Exception("an error occured");
     }
} 
private static boolean compute(){
    return false;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X