Une manière vraiment plus agréable serait de créer une classe (ou des classes) pour les exceptions.
Quelque chose comme:
class ConfigurationError : public std::exception {
public:
ConfigurationError();
};
class ConfigurationLoadError : public ConfigurationError {
public:
ConfigurationLoadError(std::string & filename);
};
La raison en est que les exceptions sont bien plus préférables que le simple transfert d'une chaîne. En fournissant différentes classes pour les erreurs, vous donnez aux développeurs une chance de gérer une erreur particulière d'une manière correspondante (pas seulement d'afficher un message d'erreur). Les personnes qui interceptent votre exception peuvent être aussi spécifiques qu'elles en ont besoin si vous utilisez une hiérarchie.
a) On peut avoir besoin de connaître la raison spécifique
} catch (const ConfigurationLoadError & ex) {
// ...
} catch (const ConfigurationError & ex) {
a) un autre ne veut pas connaître les détails
} catch (const std::exception & ex) {
Vous pouvez trouver de l'inspiration sur ce sujet dans https://books.google.ru/books?id=6tjfmnKhT24C Chapitre 9
En outre, vous pouvez fournir un message personnalisé aussi, mais attention - il n'est pas sûr de composer un message soit avec std::string
ou std::stringstream
ou tout autre moyen qui peut provoquer une exception .
Généralement, il n'y a aucune différence que vous allouiez de la mémoire (travaillez avec des chaînes de manière C ++) dans le constructeur de l'exception ou juste avant de lancer - l' std::bad_alloc
exception peut être levée avant celle que vous voulez vraiment.
Ainsi, un tampon alloué sur la pile (comme dans la réponse de Maxim) est un moyen plus sûr.
Cela est très bien expliqué sur http://www.boost.org/community/error_handling.html
Ainsi, la meilleure façon serait un type spécifique d'exception et d'éviter de composer la chaîne formatée (au moins lors du lancement).
std∷exception
fait de ne pas avoir de constructeur avecchar*
arg.