2016-03-26 18 views
0

私はまだ初心者ですが、プログラムの例外の目的を実際に把握していません。例外についてのご質問

例外をスローすると、基本的にプログラムの一部をスキップするので、私の質問の1つは次のようになります。例外がプログラムの最後につながる場合は?

また、Rectangleクラスがあるとします。

#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; 
} 

ただし、負の長さまたは高さを持つことはあまり意味がありません。 コンストラクタで例外をスローする必要がありますか?私は任意の規約を使用してその絶対値を取るべきですか? main()のユーザーが負の引数を渡さないようにする必要がありますか?

+1

の両方を参照してください...オブジェクトに渡す前にデータを検証GUIを持つことには何も問題はありません。オブジェクトをコンストラクタ内で自己保護することも、正しい方法です。両方の理由は何ですか? GUIプログラマとオブジェクトがあなたのコントロールから外れていることがあります。場合によってはオブジェクトを記述することがあり、オブジェクトの使用方法についてはわかりません。コンストラクタで例外を渡すときは、オブジェクトを使用している人と契約しているからです。彼らが契約を破ると、例外が発生します。 –

答えて

1

はい、コンストラクタでは、エラーを示す以外のオプションはありませんが、例外があります。オブジェクトの有効な状態を保証できない場合は、オブジェクトをスローするのが最善です。たとえば、例外の詳細情報については

#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_; 
}; 

はこのFAQに見えるか、あなたの会社ではないことを決めたのでCppCoreGuidelines

のエラーセクションにC++でのエラー処理する「ベストプラクティス」のために時々例外は(望ましくありませんそれらを使用するために)しかし、あなたはまだいくつかの主張をしたい。 CppCoreGuiidelinesは、ExpectsEnsuresという名前のマクロを提案しています(言語機能が必要です)。前提条件と事後条件をインタフェースに記述することが計画されています。今のところ、これらは、コンパイラフラグに応じて異なる動作をするマクロにすることができます。実装の詳細はhereまたはhere

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