メジャーが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
。
それが役に立てば幸い。幸運を!