Äquivalent von Illegal von Java in C ++
-
22-08-2019 - |
Frage
In Java, wenn ein Eingabeargument ein Verfahren ungültig ist, können wir ein IllegalArgumentException
werfen (die vom Typ RuntimeException
ist). In C ++ gibt es keine Vorstellung von checked und unchecked Ausnahmen. Gibt es eine ähnliche Ausnahme in Standard C ++, die verwendet werden können, eine Laufzeitausnahme anzuzeigen? Oder gibt es einen gemeinsamen Stil nicht im Standard aber jeder folgt in der Praxis für eine Situation?
Oder soll ich nur meine eigene benutzerdefinierte Ausnahme erstellen und werfen?
Lösung
Im Gegensatz zu Java, C ++ nicht über einen "Standard-Framework", sondern nur eine kleine (und optional) Standard-Bibliothek. Darüber hinaus gibt es verschiedene Meinungen unter C ++ Programmierern, ob Ausnahmen verwenden, um alle .
Daher werden Sie verschiedene Empfehlungen von verschiedenen Personen finden: Einige Ausnahmetypen aus der Standardbibliothek verwenden möchten, einige Bibliotheken (zB Poco) eine benutzerdefinierte Ausnahme Hierarchie verwenden (abgeleitet von std :: exception) und andere nicht verwenden Ausnahmen überhaupt (zB Qt).
Wenn Sie die Standard-Bibliothek bleiben mögen, gibt es einen speziellen Ausnahmetyp:. invalid_argument
(erweitert logic_error
)
#include <stdexcept>
// ...
throw std::invalid_argument("...");
Für die Referenz: Hier ist eine Übersicht der Standardausnahmetypen definiert (und dokumentiert) in stdexcept
:
exception
logic_error
domain_error
invalid_argument
length_error
out_of_range
runtime_error
range_error
overflow_error
underflow_error
Andere Tipps
std :: domain_error kann sein, was Sie suchen, aber ich vermute, sehr wenige Leute es verwenden. Die meisten Menschen beziehen ihre eigenen Ausnahmetypen von std :: exception.
Ich verwende std::invalid_argument
für illegale Argumente immer.
Wenn durch ungültige Sie bedeutet nicht zufrieden Methode erwarteten Werte können Sie werfen
std::logic_error
or
std::runtime_error.
Wenn Sie meinen, etwas im Zusammenhang mit wirft wie ein Objekt kann nicht in einer anderen umgewandelt werden - es gibt keine Ausnahme für diese und es wird nicht automatisch ausgelöst werden.
In der Tat, es wird. Aber nur für dynamic_cast <> auf Referenzen. Es wird werfen
std::bad_cast
Ich bin nicht sicher, ob es eine gute Idee ist, diese ein, indem Sie Ihre eigene zu werfen.
Ich ziehe logic_error und seine Derivate zu verwenden, falls jemand falsche Parameter übergeben, weil es ein logischer Fehler ist: Programmierer übergeben falsche Art von Argument.
Aber mehr von all Ich mag assert in solchen Fällen verwenden. Da solche Dinge wie vorbei falsche Werte oder Typen an Ihre Funktion nur dann akzeptabel, können während der Entwicklung und solche Kontrollen bei der Freigabe vermieden werden.
Sie können eine Standard Ausnahme auslösen oder Ihre eigene Rolle. Möglicherweise möchten Sie zusätzliche Informationen in die Ausnahme sind Sie werfen, und das wäre ein guter Grund sein, Ihre eigenen zu tun.
Ich persönlich habe nicht eine solche Domäne gesehen in Systemen Überprüfung ich gearbeitet habe. Es ist sicherlich nicht universell.