442Fermer444
GoldenCrystalLe 20/01/2010 à 11:12
Link (./439) :
Disons que je suis contre les exceptions "abusives", c'est-à-dire les exceptions pour les cas non-exceptionnels. Typiquement, en java/.Net, j'aimerais pouvoir tester l'ouverture d'un fichier sans avoir systématiquement une exception. On a bien ça pour les dictionnaires en .Net (choix entre l'opérateur[] qui lance une exception et la méthode TryGetValue() qui n'en lance pas), mais il n'y a jamais d'équivalent pour les fichiers...
Bien sur que si...
L'exception est là pour te dire que t'as fait un truc qu'il fallait pas faire ou qu'il s'est produit un truc qui n'aurait [peut-être] pas du se produire. Si tu voulais vérifier que le fichier existe, en .NET tu as File.Exists ... Si tu demandes d'ouvrir le fichier, le système ne fait que ce que tu lui as demandé de faire: ouvrir le fichier, c'est normal qu'il te balance un truc à la gueule si ça ne se passe pas comme prévu. Soit l'ouverture se passe bien, soit elle se passe mal, et c'est bien au delà d'une simple question de "la clef est présente"/"la clef n'existe pas" dans le cas des dictionnaires.
Les exceptions sont faites pour être utilisées dans des cas exceptionnels, et la BCL a été relativement bien conçue de ce côté. Si ton programme s'appuie sur des cas exceptionnels pour fonctionner, le tort en vient probablement à ton programme. (Y'a les cas [exceptionnels] que tu ne peux pas détecter simplement, comme le lecteur réseau qui ne répond pas, la connexion réseau qui a laché, un programme qui a ouvert le même fichier avant ... Pour le reste ce sont des cas que tu pouvais gérer autrement, c'était à toi de le faire.)

Folco > Tu devrais utiliser des références pour tes string, autrement tu provoques une copie à chaque appel de constructeur ou autre... sad
Typiquement, prend en appel du constructeur un const std::string&, puis copie le dans un std::string à l'intérieur de ta classe, puis retourne un const std::string& sur cet objet pour le getErrorString();
class DateException
{
private:
    std::string m_ErrorString;

public:
    DateException(const std::string& error) : m_ErrorString(error) { }
    ~DateException() { }
    const std::string& getErrorString() const { return m_ErrorString; }
};