2017-12-23 12 views
6

与えられたユーザー入力が無効な場合に例外が発生するコードを書きましたので、try/catchブロックに入れましたが、まだ例外がスローされました。コード自体はかなり長いので、ここでは例外に遭遇するコードの簡略版があります。例外自体は明確で、位置 "3"は存在しないので自然に例外がスローされますが、try/catchブロックの内側にあるため捕捉されるはずですが、そうではありません。コードがtry/catchブロック内にあっても例外が発生する

int main() { 
    try 
    { 
     vector<string> test = vector<string>{ "a","b","c" }; 
     string value = test[3]; 
    } 
    catch (...) 
    { 

    } 
} 

このコードを実行すると、try/catchブロック内にあるかどうかにかかわらず、次の例外が発生します。

Exception

私も例外(const out_of_range&e)を指定しようとしたが、それはどちらかの助けにはなりませんでした。ちょうど同じ例外が発生しました。

int main() { 
    try 
    { 
     vector<string> test = vector<string>{ "a","b","c" }; 
     string value = test[3]; 
    } 
    catch (const out_of_range&e) 
    { 

    } 
} 

私はVisual Studioを使用していますが、これはIDEまたはそれが使用するコンパイラで問題になる可能性がありますか?

+0

エレメント3は、あなたのベクトルのメンバーではありません。代わりに2を使用してください。 – Raindrop7

+2

さまざまなタイプの例外*コンピュータシステムがあります。ソフトウェア、オペレーティングシステム、またはハードウェアのエラーによって引き起こされるものではなく、C++自体からスローされたものだけを捕捉することができます。あなたが[あなたのプログラムをデバッグする方法を学ぶ]ようなクラッシュ(https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

+1

あなたのクラッシュ*の背後にある理由としては、あなたの[初心者の本](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)に戻ってそれらを見直すべきです。 –

答えて

11

std::vectorstd::out_of_range例外をスローするには、.at()メソッドを使用する必要があります。 operator[]は例外をスローしません。

std::vector<int> myvector(10); 
try { 
    myvector.at(20)=100;  // vector::at throws an out-of-range 
} 
catch (const std::out_of_range& e) { 
    std::cerr << "Out of Range error: " << e.what() << '\n'; 
} 
8

これは例外ではありません。これはデバッグアサートの失敗です。

例外が必要な場合は、配列の添え字演算子ではなく、ベクトルのat(index)関数を使用する必要があります。

1

オペレータは[]ベクトルの容器にオーバーロードされているが、例外安全ではありません(動作は、このような上記あなたのポストのように、障害が発生した場合には定義されません:たとえば、あなたはこのような何かを

を行うことができます)

代わりに.at()関数を使用する必要があります。例外的に安全です。 cplusplus.com参照は言う:

Strong guarantee: if an exception is thrown, there are no changes in the container. 
It throws out_of_range if n is out of bounds. 

読む:例外安全のために底に http://www.cplusplus.com/reference/vector/vector/operator[]/ http://www.cplusplus.com/reference/vector/vector/at/

ルック。

関連する問題