Ou, "comment les Russes lancent-ils des exceptions ?".
La définition de std::exception est :
namespace std {
class exception {
public:
exception() throw();
exception(const exception&) throw();
exception& operator=(const exception&) throw();
virtual ~exception() throw();
virtual const char* what() const throw();
};
}
A école populaire de pensée pour concevoir des hiérarchies d'exceptions est de dériver de std::exception :
En général, il est préférable de lancer des objets, pas des meubles. Si possible, vous devriez lancer des instances de classes qui dérivent (en dernier ressort) de la classe std::exception . En faisant en sorte que votre classe d'exception hérite (en dernier ressort) de la classe de base standard de base des exceptions, vous vous vie plus facile pour vos utilisateurs (ils ont l'option d'attraper la plupart des choses via std::exception), et vous leur fournissez probablement leur fournir plus d'informations (comme le fait que votre exception particulière peut être un raffinement de std::runtime_error ou autre).
Mais face à Unicode, il semble impossible de concevoir une hiérarchie d'exceptions permettant d'atteindre les deux objectifs suivants :
- Dérive ultimement de std::exception pour faciliter l'utilisation du site catch.
- Assure la compatibilité Unicode pour que les diagnostics ne soient pas des tranches ou du charabia.
Il est assez simple de créer une classe d'exception qui peut être construite avec des chaînes Unicode. Mais la norme stipule que what() doit retourner un const char*, donc à un moment donné, les chaînes d'entrée doivent être converties en ASCII. Que cela soit fait au moment de la construction ou lorsque what() est appelé (si la chaîne source utilise des caractères non représentables par l'ASCII 7 bits), il peut être impossible de formater le message sans perte de fidélité.
Comment concevoir une hiérarchie d'exceptions qui combine l'intégration transparente d'une classe dérivée de std::exception avec des diagnostics Unicode sans perte ?
1 votes
Ce n'est pas grave, il suffit d'utiliser un codage qui utilise des octets. Selon moi, le plus gros problème avec
std:.exception
est que les classes dérivées en dérivent non virtuellement. De ce fait, il n'y a aucun moyen de dériver de votre propre classe de base, dérivée destd::exception
et, dites,std::out_of_range
.0 votes
@sbi : C'est vrai, mais j'esquive ce problème en définissant ma hiérarchie uniquement en termes de
std::exception
directement. Je lance mon proprestd::exception
-et laisser les autres exceptions définies par le standard à la bibliothèque standard. Ce n'est pas une solution idéale, certes, mais pour mon usage, c'est la meilleure solution possible compte tenu de l'état actuel de la norme.1 votes
Je viens de remarquer : Il semble que ce soit un doublon de : stackoverflow.com/questions/618111/
9 votes
En Russie soviétique, l'exception vous jette.