2013-03-28 3 views
0

Je nettoie mon code et passe à la gestion des erreurs grâce à des exceptions (car cela raccourcira le code de manière significative à certains endroits).Traitement des erreurs par le biais d'exceptions

Cela signifie que j'ai besoin de concevoir ma propre hiérarchie de classes d'exception.

En ce moment, il ressemble à ceci:

namespace error 
    { 
    /** Generic error */ 
    class generic : public std::except 
    { 
    public: 
     generic(const std::string& s) : std::except(s) {} 
    }; 

    /** Namespace for network related errors */ 
    namespace network 
    { 
    /** Generic network error */ 
    class generic : public ::error::generic 
     { 
     public: 
     generic(const std::string& s) : ::error::generic(s) {} 
     }; 

    /** Network timeout */ 
    class timeout : public ::error::network::generic 
     { 
     public: 
     timeout(const std::string& s) : ::error::network::generic(s) {} 
     }; 
    } 
    } 

Le problème est que cela ne semble pas particulièrement lisible. Existe-t-il un style préféré pour gérer les hiérarchies de classes d'exceptions?

+2

Cela me semble bien. Si j'étais vous, je supprimerais simplement ':: error' et' :: error :: network', car ils ne sont pas nécessaires dans ces cas (si je ne lis pas mal quelque chose) –

+0

Je suis d'accord avec ce que @ Kiril Kirov a dit, mais je ne vois pas non plus beaucoup de raisons pour la classe "générique". –

+0

Vous vouliez probablement dire 'std :: exception', pas' except', et cela a des fonctions purement virtuelles que vous devrez implémenter. Assurez-vous que votre objet d'exception respecte les garanties d'exception dont il a besoin (en particulier, la copie ne doit pas ** déclencher une exception.) Une erreur de type 'generic' et une exception de type 'generic' semble un peu ... –

Répondre

2

Lorsqu'un nom de classe ne décrit pas le rôle qu'il aura, c'est un signe certain que la classe ne devrait pas exister. Vous avez deux classes appelées generic. Quel est le point d'entre eux?

Vraiment, vous avez seulement introduit un type d'exception, timeout. Je voudrais réécrire ce que vous avez donné comme simplement:

namespace error 
{ 
    namespace network 
    { 
    class timeout : public std::exception 
    { 
     public: 
     timeout(const std::string& s); 
     const char* what(); 
    } 
    } 
}