0

My understanding of the try function, was to stop errors that could possibly occur between try and catch. But if I do something like this:

std::vector<int> testvector;
testvector.push_back(1);

try{
cout << testvector[53485375345534] << endl;
}catch(...){

}

My idea was that it would not cause an error in the expense for memory, but it does nothing in this case, an error still pops up.

Could someone explain the proper reason for using try, so far in my experience, i could have used an if statement beforehand instead, could someone give me an example when you would need a try statement?

4

5 に答える 5

3

operator []の境界をチェックしませんstd::vector

ただし、std::vector::at()例外をスローします。代わりに使用する必要があります。

于 2013-01-24T07:13:45.133 に答える
2

エラーにはさまざまな種類があります。

  1. 例外。これらは、プログラムが作成するエラーであり、処理throwできるエラーですcatch
  2. アクセス違反、システム例外など、別名「クラッシュ」。これらは非常に深刻であり、発生したときに多くのことを実行することはできません(少なくとも、標準のC ++の可能性の範囲内ではありません)。したがって、正しいプログラムを作成することをお勧めします。そうすれば、これらは発生しません。
  3. アサーション。これらは、開発およびテスト中にプログラムロジックと制約をチェックすることを目的としています。これらは通常、デバッグコードにのみ表示されます。つまり、リリースビルドではオフにする必要があります。アサーションが発生すると、Windowsでは何が問題だったかを示すウィンドウがポップアップ表示されます。

ここで推測しているだけです-MSVisualStudioを使用していますか?

MSVCのベクトル実装は、operator[]デバッグモードで引数をチェックし、引数が実際にベクトルの範囲内にあるかどうかをアサートします。その主張は例外ではないので、あなたはそれを捕まえることができません。

于 2013-01-24T08:24:44.810 に答える
1

テストケースは無効であり、std::vector::operator[]境界チェックを実行しません。また、例外をスローしません。例外ではなく未定義の動作を期待しています。std :: vector::at関数を試すことができます

std::vector<int> testvector;
testvector.push_back(1);

try{
    std::cout << testvector.at(53485375345534) << endl;
}catch(std::exception& e){
    std::cout << e.what() << std::endl;
}
于 2013-01-24T07:16:43.393 に答える
1

Try-Catchの概念は、プログラムを壊す可能性のあるエラーを処理することですが、ほとんどの場合、そうしなくても処理できます。あなたの例は、完全に正しい操作に適していますが、要求しているデータが存在する場合に限ります。その「場合のみ」は関数自体で処理できますが、誤った入力に反応することはできません。代わりに、このような場合、関数は、呼び出しをTry-Catchで囲むと、コードで処理できる例外をスローします。Catchブロック内では、ユーザーに通知するか、少なくともログファイルに不正な動作を書き込むことがよくあります。また、デフォルト値をロードしたり、変数を変更して関数呼び出しを繰り返したりすることもできます。Try-Catchは、「許可を得るためではなく、許しを求める」と表現される場合があります(後者は以前のIfです)。

一般に、Try-Catchは次のように擬似コードで読み取ることができます。

Try:
    Do what you think is right to do but be aware it could be wrong...
Catch:
    You were too optimistic and should react in a proper way...

これが、Try-Catchの概念をもう少しよく理解するのに役立つことを願っています。

于 2013-01-24T07:40:13.373 に答える
0

動作するかどうかわからない関数を使用している場合は、throwステートメントを使用します。たとえば、GUIウィンドウを作成する場合は、tryブロックを使用するため、ウィンドウが作成されていない場合でも、存在しないウィンドウで入力を待つことになりません。

于 2013-01-24T07:30:27.010 に答える