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();
}
}
あなたの答えをありがとう。私が 'std :: out_of_range'を置き換える別の例外を持つ理由は、同じ関数内の2つの別々のコンテナの値を設定または取得しているとします。たとえば、' function1() 'と言います。アプリケーションでは特別な意味があります(数学アプリケーションであり、どのコンテナが重要なのかもしれない)ので、 'CONTAINER_1_OUT_OF_RANGE()'や 'CONTAINER_2_OUT_OF_RANGE()'を投げたいかもしれません。これは実用的でないか不要であると思われますか? – Deniz
私は、例外タイプの詳細レベルが有用であった状況を見ていませんでした(明らかに、例外タイプがないというわけではありません)。範囲外の要素にアクセスしない方がはるかに良いでしょう。もしそれがバグだとすれば、例外メッセージとスタックトレースが型よりも役に立つ可能性があります。例外は例外的でなければならない。それを捕まえ、その細部に基づいて決定を下すことは、私にものをする正しい方法のようには感じません。 –