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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top