2016-03-26 13 views
0

Ich bin immer noch ein Anfänger und ich verstehe nicht wirklich den Zweck von Ausnahmen in einem Programm.Fragen über Ausnahmen verwenden

Wenn Sie eine Ausnahme auslösen, überspringen Sie grundsätzlich einen (kleinen oder großen) Teil Ihres Programms, also wäre eine meiner Fragen: Sollte eine Ausnahme zum Ende des Programms führen?

Angenommen, wir haben eine Klasse Rectangle. Es wäre zu definieren, durch seine Länge und seine Höhe wie folgt aus:

#include <iostream> 

using namespace std; 

class Rectangle { 
public: 
    Rectangle(double length, double height) 
    { 
     if (length > 0 and heigth > 0) { 
      length_ = length; 
      height_ = height; 
     } 
     else { 
      // Throw an exception ? Use a convention ? 
     } 
    } 
    // other methods 
private: 
    double length_; 
    double height_; 
}; 

int main() { 
    // do stuff 

    return 0; 
} 

Allerdings wäre es nicht viel Sinn, eine negative Länge oder Höhe zu haben. Also sollte ich eine Ausnahme im Konstruktor werfen? Sollte ich eine willkürliche Konvention verwenden und ihren absoluten Wert nehmen? Sollte ich verhindern, dass der Benutzer in main() negative Argumente übergibt?

+1

beide ... Es ist nichts falsch mit, die die GUI Validierung Daten, bevor sie zu einem Objekt vorbei. Auch das Objekt im Konstruktor zu schützen, ist der richtige Weg. Warum beides? weil du manchmal nicht die Kontrolle über beide hast ... manchmal ist dein GUI-Programmierer und das Objekt außer Kontrolle. Manchmal schreiben Sie das Objekt und Sie haben keine Ahnung, wie das Objekt verwendet wird. Wenn Sie eine Ausnahme im Konstruktor übergeben, liegt das daran, dass Sie einen Vertrag mit dem Benutzer haben, der Ihr Objekt verwendet. Wenn sie diesen Vertrag brechen, erheben Sie eine Ausnahme. –

Antwort

1

Ja, in einem Konstruktor haben Sie keine andere Option, um einen Fehler anzuzeigen, sondern eine Ausnahme. In Fällen, in denen Sie keinen gültigen Zustand Ihres Objekts sicherstellen können, ist es am besten, einen zu werfen. Zum Beispiel

#include <iostream> 
#include <exception> 

using namespace std; 

struct Rectangle_exception : public std::runtime_error { 
     Rectangle_exception(const char* const message): std::runtime_error(message) {} 
}; 

class Rectangle { 
public: 
    Rectangle(double length, double height) 
    { 
     if (length > 0 && heigth > 0) { 
      length_ = length; 
      height_ = height; 
     } 
     else { 
      throw Rectangle_exception{"Invalid dimensions."}; 
     } 
    } 
    // other methods 
private: 
    double length_; 
    double height_; 
}; 

Weitere Informationen über Ausnahmen aussehen in diesen FAQ oder für „Best Practices“ Umgang in C auf Fehler ++ in dem Fehlerabschnitt CppCoreGuidelines

Manchmal sind Ausnahmen nicht wünschenswert (weil Ihr Unternehmen nicht entschieden um sie zu benutzen), aber Sie wollen immer noch einige Behauptungen haben. Die CppCoreGuiidelines schlägt Macros vor (und möchte ein Sprachfeature) mit den Namen Expects und Ensures. Es ist geplant, dass Sie in der Schnittstelle Vorbedingungen und Nachbedingungen angeben können. Vorläufig können dies Makros mit unterschiedlichem Verhalten sein, abhängig von Ihren Compiler-Flags. Für Implementierungsdetails here oder here sehen

class Rectangle { 
public: 
    Rectangle(double length, double height) 
    { 
     Expects(length > 0 && height > 0); 
     length_ = length; 
     height_ = height; 
    } 
    // other methods 
private: 
    double length_; 
    double height_; 
};