9

私は多くの場所でif...elseステートメントを使用してきましたが、例外処理は初めてです。これら2つの主な違いは何ですか?

例:

 int *ptr = new (nothrow) int[1000];
 
 if (ptr == NULL) {
     // Handle error cases here...
 }

また

  try
  {
    int* myarray= new int[1000];
  }
  catch (exception& e)
  {
    cout << "Standard exception: " << e.what() << endl; 
  }

したがって、ここでは、ビルド関数のようないくつかの例外用の標準クラスを使用していますe.what()。なので有利かもしれません。それ以外にも、他のすべての機能を使用して処理できますif...else。例外処理を使用するメリットは他にありますか?

4

5 に答える 5

3

回答でコメントの内容を収集するには:

1998 年の標準化以来、new失敗時にヌル ポインターを返さず、例外、つまり をスローしますstd::bad_alloc。これは C とは異なりmalloc、おそらく C++ の初期の標準化前の実装とは異なり、NULL も返されたnew 可能性があります (わかりません、tbh)。

C++ では、割り当ての失敗時に例外ではなく nullpointer を取得する可能性があります。

int *ptr = new(std::nothrow) int[1000];

つまり、最初のコードは、C++ 例外が存在する場合に C スタイルのエラー処理を試みているため、意図したとおりに機能しません。割り当てが失敗した場合、例外がスローされ、if ブロックには入らず、プログラムはおそらく終了しますbad_alloc

一般的なエラー処理と例外とリターン コードを比較する記事はたくさんありますが、ここでそのトピックを取り上げようとすると、かなりの距離になります。例外の理由には、

  • 関数の戻り値の型はエラー処理によって占有されませんが、実際の値を返すことができます。「出力」関数パラメーターは必要ありません。
  • すべての関数ですべての関数呼び出しの戻りを処理する必要はありませんが、実際にエラーを処理できる呼び出しスタックのいくつかのレベルで例外をキャッチすることができます
  • errno例外は、1 つのグローバル変数と 1 つの返されるエラー コードと比較して、任意の情報をエラー処理サイトに渡すことができます。
于 2013-08-19T06:50:17.017 に答える
0

まず、if ステートメントを使用した最初のコードは、例外が処理されないために new[] 演算子によって例外がスローされた場合にプログラムを終了します。たとえば、ここでそのようなことを確認できます:http://www.cplusplus.com/reference/new/operator%20new%5B%5D/

また、例外は、割り当てが失敗した場合だけでなく、他の多くの場合にもスローされます。その主な機能 (私の目には) は、アプリケーション内の制御を上に移動しています (例外が処理される場所)。例外についてもう少し読むことをお勧めします。よく読むには、Scott Meyers による「より効果的な C++」を読んでください。例外に関する素晴らしい章があります。

于 2013-08-19T06:49:26.563 に答える