5

「トライ&キャッチ」を学ぶ。次のコードの何が問題になっていますか?アドバイスありがとうございます。

実行エラー:

terminate called without an active exception
Aborted

コード:

#include <stdio.h>
int main()
{
  int a = 3;

  try
  {
    if (a < 5)
      throw;
  }
  catch (...)
  {
    printf ("captured\n");
  }

  return 0;
}
4

5 に答える 5

5

throw;ステートメントは現在の例外を再スローしようとしますが、おそらく例外はありません。あなたは次のようなものが必要です

throw some_exception_object();
于 2012-10-16T00:07:23.750 に答える
4

メジャーが2つ、マイナーが2つ、合計4つあります。一度に一つのことを...

1.アクティブな例外なしで使用法を再スローします

throw;ステートメントは、現在キャッチされている例外を再スローするために使用されます。例えば:

try {
    do_something();
} catch (const std::exception &) {
    throw; // This statement re-throws an exception that was caught in this "catch" block.
}

あなたの場合、throw;例外をキャッチせずに使用しているため(つまり、catchブロック内に直接または間接的に表示されないため)、プログラムは終了します。あなたの場合のように、例外をスローし、再スローしない必要がある場合は、スローする例外オブジェクトを指定する必要があります。例えば:

throw std::runtime_error("Something bad happened");

2.キャッチされた例外を再スローしないcatch-all句

キャッチオール句(catch (...))は完全に合法的なC++です。ただし、キャッチされた例外は再スローされません。それは合法的なC++コードですが、そのような使用法はタブーです。CおよびC++ランタイムは通常、特定の機能を実装するために特別なタイプの例外を使用しています。たとえば、NPTLは例外を使用してスレッドキャンセルを実装しています。を使用してその例外をキャッチした場合catch (...)、スレッドはキャンセルされず、悪い時間を過ごすことになります。一般に、タイプごとに例外をキャッチする必要があります。ほとんどの場合、例外はから継承されるため、正確な型をキャッチする場合は、-std::exceptionを記述する必要があります。ただし、キャッチオールを使用する必要がある場合は、忘れずに再スローしてください。例えば:catch (const std::exception &)catch(const TypeYouExpect &)

try {
    do_something();
} catch (...) {
    throw; // DO NOT FORGET TO RE-THROW.
}

3.ヘッダーの命名...

Cヘッダーを含めているのに対し、C++は標準のC機能用に独自のヘッダーを提供しています。だから、ヘッダー:

#include <stdio.h>

..する必要があります:

#include <cstdio>

C++固有のC関数は特別な扱いを受けます。たとえば、std名前空間で使用できるようになります。またはstd::open()の代わりに使用できるようにします。大したことではありませんが、行くことを強くお勧めします。open()::open()

4.メインから戻ります。

Cとは異なり、C++のmain()機能は非常に特殊です。それはあなたが持っていないことを可能にしますreturn 0;。これはデフォルトの動作です。したがって、本当に何らかの値を返す必要がない限り、を入力しないことで時間を節約できますreturn 0;。ただし、それmainがそのような唯一の関数であり、関数がマークされていない限り、他のすべての場所で明示的に何かを返す必要があることを忘れないでくださいvoid

それが役に立てば幸い。幸運を!

于 2012-10-16T00:21:03.913 に答える
4

tryブロックの内部では、をスローするかを指定する必要があります。throw単独で使用できる唯一の場所はcatch、現在の例外を再スローするブロック内です。throw既に発見したように、現在の例外がアクティブでない状態で単独で呼び出すと、アプリが強制終了されます。

これを試して:

#include <stdio.h> 

int main() 
{ 
  int a = 3; 

  try 
  { 
    if (a < 5) 
      throw 1; // throws an int 
  } 
  catch (...) 
  { 
    printf ("captured\n"); 
  } 

  return 0; 
} 

throw何かを投げる限り、何でもできます。

于 2012-10-16T00:09:30.760 に答える
1

実際にオブジェクトを投げる必要があります。といった単純なものでも

throw "error";

あなたが望むようにエラーをキャッチします。

ここで実際に見てください

于 2012-10-16T00:09:31.613 に答える
1

例外をスローするステートメントは次のとおりです。

throw <expression>;

この文:

throw;

re-throw ステートメントとも呼ばれ、キャッチされた既存の例外を再スローするために使用されます。通常、catchブロックで使用されます。たとえば、例外を見て、続行、再試行、または中止できるかどうかを判断します。中止することにした場合は、例外を再スローして、コール スタックの他の誰かが例外をキャッチしてこのエラーを処理できるようにします。

例えば:

// getResult() calls can fail with a deadlock exception
// This method will retry up to 3 times before failing
Result getResultWithRetry()
{
    int nbTry = 3;
    for(;;) {
        try {
            return getResult();
        } catch (DeadLockException& e) {
            if (nbTry == 0) {
                throw; // re-throw the deadlock exception
            }
        }
        --nbTry;
    }
}
于 2012-10-16T00:27:06.050 に答える