2017-02-24 6 views
0

out_of_range()のエラーが発生したときに、ユーザー定義の例外をスローする以下の方法のいずれかを実行するとよいでしょう。私には、あまり経験のない人として、彼らは同じです。しかし、私は両者の間に何か違いがあるのか​​どうか、もしそうなら何があるのか​​を知りたいと思っています。C++ベクタ例外処理:どちらがout_of_range()をスローする良い方法で、なぜですか?

std::vector<int> container {1, 2, 3, 4, 5}; 

int function1(int x, int y) { 

    if(x < 0 || y < 0) 
     throw USER_DEFINED_OUT_OF_RANGE(); 

    if(x >= container.size() || y >= container.size()) 
     throw USER_DEFINED_OUT_OF_RANGE(); 

    return container[x] + container[y]; 

} 

int function2(int x, int y) { 

    try { 
     return container[x] + container[y]; 
    } 
    catch(const std::out_of_range& e) { 
     throw USER_DEFINED_OUT_OF_RANGE(); 
    } 

} 

答えて

2

最初のものは動作し、2番目のものは動作しません。最初の方が良いです。

(。。container[x]は@NeilButterworthが示唆するようにあなたは、at()を使用して、その問題を解決できxが範囲外の場合、それはスローされません未定義の動作です)しかし、あなたは大きなポイントを逃している - あなたはこれをまったくやってはいけません。このコンテキストには完全に優れた標準例外があります。それを他のものに変換することは誰にも役立たないでしょう。

+0

あなたの答えをありがとう。私が 'std :: out_of_range'を置き換える別の例外を持つ理由は、同じ関数内の2つの別々のコンテナの値を設定または取得しているとします。たとえば、' function1() 'と言います。アプリケーションでは特別な意味があります(数学アプリケーションであり、どのコンテナが重要なのかもしれない)ので、 'CONTAINER_1_OUT_OF_RANGE()'や 'CONTAINER_2_OUT_OF_RANGE()'を投げたいかもしれません。これは実用的でないか不要であると思われますか? – Deniz

+0

私は、例外タイプの詳細レベルが有用であった状況を見ていませんでした(明らかに、例外タイプがないというわけではありません)。範囲外の要素にアクセスしない方がはるかに良いでしょう。もしそれがバグだとすれば、例外メッセージとスタックトレースが型よりも役に立つ可能性があります。例外は例外的でなければならない。それを捕まえ、その細部に基づいて決定を下すことは、私にものをする正しい方法のようには感じません。 –

0

インデックスが範囲外の場合、ベクターによって例外がスローされます。

また、無効なインデックスを使用した結果が定義されておらず、まったくチェックしていないことをドキュメントで説明してください。

+0

しかし、代わりに「USER_DEFINED_OUT_OF_RANGE();」をスローしたい場合はどうすればいいですか? – Deniz

+0

しかし、それはOPが尋ねたものではありません... – einpoklum

関連する問題