Ein wirklich schöner Weg wäre, eine Klasse (oder Klassen) für die Ausnahmen zu erstellen.
Etwas wie:
class ConfigurationError : public std::exception {
public:
ConfigurationError();
};
class ConfigurationLoadError : public ConfigurationError {
public:
ConfigurationLoadError(std::string & filename);
};
Der Grund dafür ist, dass Ausnahmen viel besser sind als nur das Übertragen einer Zeichenfolge. Indem Sie verschiedene Klassen für die Fehler bereitstellen, geben Sie Entwicklern die Möglichkeit, einen bestimmten Fehler entsprechend zu behandeln (und nicht nur eine Fehlermeldung anzuzeigen). Personen, die Ihre Ausnahme abfangen, können so spezifisch sein, wie sie es benötigen, wenn Sie eine Hierarchie verwenden.
a) Möglicherweise muss der genaue Grund bekannt sein
} catch (const ConfigurationLoadError & ex) {
// ...
} catch (const ConfigurationError & ex) {
a) Ein anderer möchte keine Details wissen
} catch (const std::exception & ex) {
Inspirationen zu diesem Thema finden Sie unter https://books.google.ru/books?id=6tjfmnKhT24C Kapitel 9
Darüber hinaus können Sie auch eine benutzerdefinierte Nachricht liefern, aber seien Sie vorsichtig - es ist nicht sicher ist , eine Nachricht mit entweder zu komponieren std::string
oder std::stringstream
oder irgendeine andere Art und Weise , die eine Ausnahme verursachen kann .
Im Allgemeinen gibt es keinen Unterschied, ob Sie im Konstruktor der Ausnahme oder kurz vor dem Auslösen Speicher zuweisen (mit Zeichenfolgen in C ++ arbeiten). std::bad_alloc
Ausnahme kann vor dem ausgelöst werden, den Sie wirklich möchten.
Ein auf dem Stapel zugewiesener Puffer (wie in Maxim's Antwort) ist also sicherer.
Es wird sehr gut unter http://www.boost.org/community/error_handling.html erklärt
Der schönere Weg wäre also ein bestimmter Typ der Ausnahme und das Vermeiden des Komponierens der formatierten Zeichenfolge (zumindest beim Werfen).
std∷exception
haben keinen Konstruktor mitchar*
arg.