0

私は例外処理を理解しようとしており、この単純なコードをテストしています:

#include <iostream>
#include <vector>
#include <stdexcept>

using namespace std;

int main()
{
    vector<int> v(4);
    try
    {
        v[v.size()] = 100;
    }
    catch(const exception& e){
        cerr << e.what() << endl;
    }
}

出力は次のようになると思います。

範囲外エラー: vector::_M_range_check

ただし、これを行った場合と同じエラー メッセージが表示されます。

...
vector<int> v(4);
v[v.size()] = 100;
...

つまり、通常の「例外を認識しない」コードです。

私の質問は: 私が実装している try catch ロジックの何が問題なのですか?

4

2 に答える 2

6

添え字演算子を使用して[]ベクトル要素にアクセスしても、範囲チェックは行われません。インデックスが範囲外の場合、未定義の動作が発生します。

アクセスをチェックするには、at代わりに次の関数を使用します。

v.at(v.size()) = 100;

チェックが失敗するとstd::out_of_range、 のサブクラスであるがスローさstd::exceptionれ、コードでキャッチする必要があります。

于 2013-06-20T14:57:39.593 に答える
2

std::vector<int>問題は、メンバーによってスローされた例外のタイプがoperator[]から派生したものであると想定していることです。これは、範囲チェックを実行するか、例外をスローする必要がstd::exceptionあることを標準が指定していないため、当てはまらない可能性があります。operator[]

から派生しatたオブジェクトをスローする範囲チェック関数の代わりにメンバー関数を使用してみてください。std::out_of_rangestd::exception

例えば:

v.at( v.size() ) = 100;
于 2013-06-20T14:59:15.040 に答える