2009-03-25 13 views
21

Wenn in Java ein Eingabeargument für eine Methode ungültig ist, können wir eine IllegalArgumentException (die vom Typ RuntimeException ist) werfen. In C++ gibt es keine Vorstellung von aktivierten und deaktivierten Ausnahmen. Gibt es im Standard C++ eine ähnliche Ausnahme, mit der eine Laufzeitausnahme angezeigt werden kann? Oder gibt es einen gemeinsamen Stil, nicht im Standard, aber jeder folgt in der Praxis für eine solche Situation?Äquivalent von IllegalArgumentException von Java in C++

Oder sollte ich nur meine eigene benutzerdefinierte Ausnahme erstellen und sie werfen?

Antwort

39

Im Gegensatz zu Java hat C++ kein "Standardframework", sondern nur eine kleine (und optionale) Standardbibliothek. Außerdem gibt es unter C++ - Programmierern unterschiedliche Meinungen, ob Ausnahmen überhaupt zu verwenden sind.

Daher finden Sie verschiedene Empfehlungen von verschiedenen Leuten: Einige verwenden gerne Ausnahmetypen aus der Standardbibliothek, einige Bibliotheken (zB Poco) verwenden eine benutzerdefinierte Ausnahmehierarchie (abgeleitet von std :: exception), andere nicht verwende überhaupt Ausnahmen (zB Qt). Wenn Sie bei der Standardbibliothek bleiben möchten, 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 
2

std :: domain_error kann sein, was Sie suchen, aber ich vermute, dass sehr wenige Leute es verwenden. Die meisten Leute leiten ihre eigenen Ausnahmetypen von std :: exception ab.

1

Wenn durch ungültige Sie bedeutet nicht zufrieden Methode erwarteten Werten Sie

std::logic_error 
or 
std::runtime_error. 

werfen Wenn Sie etwas im Zusammenhang bedeuten, wirft wie ein Objekt kann nicht in eine andere umgewandelt werden - es gibt keine Ausnahme für die und es wird nicht automatisch geworfen.

In der Tat wird es. 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 eigenen zu werfen.

Ich bevorzuge logic_error und seine Derivate für den Fall, dass jemand einen falschen Parameter übergeben hat, weil es ein logischer Fehler ist: Programmierer hat falschen Argumenttyp übergeben.

Aber mehr von allen möchte ich in solchen Fällen Assert verwenden. Da solche Dinge wie das Übergeben falscher Werte oder Typen an Ihre Funktion nur während der Entwicklung akzeptiert werden können, sollten solche Überprüfungen in der Veröffentlichung vermieden werden.

+0

Führt dynamic_cast <>() mit einem Referenztyp eine Standardausnahme aus? –

+0

Es tut eine std :: bad_cast Ausnahme. Wenn es mit Referenzen ist. Mit Zeigern wird eine 0 zurückgegeben und der Benutzercode muss den Ergebniswert prüfen. –

+0

Ja, std :: bad_cast. –

2

Ich verwende immer std::invalid_argument für ungültige Argumente.

1

Sie können eine Standard Ausnahme auslösen oder Ihre eigene Rolle. Vielleicht möchten Sie zusätzliche Informationen in die Ausnahme aufnehmen, die Sie werfen, und das wäre ein guter Grund, Ihre eigenen zu machen.

Persönlich habe ich solche Domain-Überprüfung in Systemen, an denen ich gearbeitet habe, nicht gesehen. Es ist sicherlich nicht universell.