Question

J'ai une méthode BO qui doit exécuter deux opérations pour remplir son contrat.

  1. insérez un enregistrement dans la base de données
  2. envoyer une notification par courrier électronique contenant les métadonnées de l'enregistrement

Les deux sont gérés avec des appels aux méthodes DAO individuelles responsables de l'exécution de l'action.

Je ne capture pas les exceptions dans mon DAO, je les gère et les publie dans le BO. Le premier appel est destiné au DAO pour l'insertion et peut générer une exception NullReferenceException ou l'une des exceptions SQL. La méthode de messagerie utilise SmtpClient.Send, qui peut générer de nombreuses exceptions.

Est-il possible de forcer la méthode enfant qui appelle la fonctionnalité de messagerie à renvoyer un seul type d'exception, un type personnalisé, via un attribut?

Pour illustrer cela:

public void AddSupportTicket(SupportTicketDTO ticket)
{
    try
    {
        supportTicketDAO.Insert(ticket);
        email.SendNotification(ticket);
    }
    catch (ExceptionA exc) { ... } // both of the methods can throw exceptions that
    catch (ExceptionB exc) { ... } // can overlap.  I just care about returning       
    catch (ExceptionC exc) { ... } // a custom EmailException or DataException
}

Je peux envelopper chaque appel de méthode enfant dans sa propre tentative try et lancer l'exception personnalisée que je veux, mais c'est juste un autre niveau de capture try qui est piégé par une autre tentative try dans AddSupportTicket, puis un dans l'interface utilisateur à rediriger vers une erreur intelligente, donc cela ne me semble pas très bien.

Comment dois-je lancer efficacement l'exception personnalisée correcte?

Était-ce utile?

La solution

Oui, c'est très possible. Consultez la bibliothèque d'entreprise blocage de la gestion des exceptions . Beaucoup de choses intéressantes sur la levée, le wrapping, la journalisation des exceptions depuis et entre les couches, ainsi que la configuration de politiques afin que vous puissiez les gérer en configuration si vous le souhaitez. Combiné au bloc d’application de journalisation, il constitue une puissante combinaison.

Autres conseils

Si vous utilisez WCF, vous pouvez spécifier le type d'exception pouvant être levée à partir d'une fonction donnée. Ainsi, dans l'interface de service, vous obtiendrez quelque chose comme

.
[OperationContract]
[FaultContract(typeof(MemberAlreadyExistsException))]
void MemberInsert(Member mu);

Je ne connais pas d'attribut, mais vous ne pouvez pas simplement faire:

try{
...
} catch(Exception ex) {

  throw new MyException("Some biz msg", ex);
}

C # ne fournit pas de fonctionnalités telles que le mot clé renvoie de Java, si c'est ce dont vous parlez. Vous pouvez documenter les types d'exceptions que votre code peut générer via les normes de documentation XML, mais il n'y a aucun moyen de le forcer par contrat.

Votre meilleur choix est une documentation appropriée et une gestion intelligente des exceptions à tous les niveaux de votre application, aussi simple que cela puisse paraître.

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