2010-11-16 5 views
1
CreateDocument(string templatePath) 
{ 
    Document doc = OpenDocument(templatePath); 
    Picture pic = GetLogo(); 
    AddLogo(doc, pic, templatePath); 
} 

AddLogo(Document doc, Picture logo, string templatePath) 
{ 
    Picture placeholder = doc.FindLogoPlaceholder(); 
    if (placeholder.Size != logo.Size) 
    { 
     throw new ApplicationException(
      String.Format("Invalid template {0}, logo size: {1}, required: {2}", 
       templatePath, placeholder.Size, logo.Size 
      )); 
    } 
} 

Considérons le code ci-dessus comme un exemple que je viens de faire.Inclure les paramètres uniquement dans le but de signaler les exceptions dans les fonctions internes

Notez que la seule raison templatePath est passée dans la méthode AddLogo est de faciliter la génération d'exception.

J'ai quelque chose dans mon code aujourd'hui où je devais faire ceci, et il me semble que c'est une odeur de code vraiment désagréable. Mais je ne connais pas très bien les schémas de gestion des exceptions et je ne vois pas vraiment de meilleur moyen de le faire. Je me demande ce que vous en pensez et s'il y a un meilleur modèle pour faire face à des situations comme celle-ci.

+0

Est-ce que 'Document' exposer une propriété du chemin qu'il a ouvert dans le' OpenDocument' appeler? Si tel est le cas, cela annulerait le besoin de passer des paramètres aux fins d'exceptions, ce qui, je conviens, est tombé de l'arbre moche et a frappé toutes les branches en descendant. –

Répondre

5

Créer l'exception à un niveau supérieur:

CreateDocument(string templatePath) 
{ 
    Document doc = OpenDocument(templatePath); 
    Picture pic = GetLogo(); 
    try { 
     AddLogo(doc, pic); 
    } catch (InvalidLogoSize e) { 
     throw new ApplicationException(
      String.Format("Invalid template {0}, logo size: {1}, required: {2}", 
       templatePath, e.pSize, e.lSize 
      )); 
    } 
} 

AddLogo(Document doc, Picture logo) 
{ 
    Picture placeholder = doc.FindLogoPlaceholder(); 
    if (placeholder.Size != logo.Size) 
    { 
     throw new InvalidLogoSizeException(placeholder.Size, logo.Size); 
    } 
} 
+0

Vous devez inclure l'exception d'origine en tant qu'exception interne ou vous perdrez une partie de la trace de la pile. – Henrik

+0

+1 pour lancer une exception ApplicationException. Dans la clause catch de CreateDocument, je définirais l'exception d'origine comme l'exception interne à l'exception nouvellement levée. Cela permet de revenir au point où le problème réel s'est produit. –

+0

@Marnix: pourquoi +1 pour lancer 'ApplicationException'? Je suis assez sûr que ApplicationException est considéré comme trop général dans la plupart des cas. FxCop gémit certainement à ce sujet. – fearofawhackplanet

1

Vous serait généralement jeter l'exception, puis l'attraper à tout calque où vous pouvez ajouter plus d'informations, l'envelopper dans une nouvelle exception et jeter celui-là.

1

L'appelant de la fonction peut prendre un rethrow avec des informations supplémentaires:

CreateDocument(string templatePath) 
{ 
    Document doc = OpenDocument(templatePath); 
    Picture pic = GetLogo(); 
    try 
    { 
     AddLogo(doc, pic); 
    } 
    catch(Excpetion e) 
    { 
     throw new ApplicationException(templatePath, e); 
    } 
} 
+0

Il m'est apparu dès que j'ai posté la question que c'est ce que je devrais faire! :) – fearofawhackplanet

Questions connexes