私はC++でコマンドラインアプリケーションを作成しています。未処理の例外が発生した場合、私はアプリがひどくクラッシュするのを避けたいが、可能な限りクリーンアップしてエラーメッセージを表示する。C++のコマンドラインアプリケーションで、トップレベルで例外をキャッチする方法はありますか?
プログラムがクラッシュするのを防ぐために、トップレベルで例外をキャッチするにはどうすればよいですか? std::exception
、...
などをキャッチする必要がありますか?
私はC++でコマンドラインアプリケーションを作成しています。未処理の例外が発生した場合、私はアプリがひどくクラッシュするのを避けたいが、可能な限りクリーンアップしてエラーメッセージを表示する。C++のコマンドラインアプリケーションで、トップレベルで例外をキャッチする方法はありますか?
プログラムがクラッシュするのを防ぐために、トップレベルで例外をキャッチするにはどうすればよいですか? std::exception
、...
などをキャッチする必要がありますか?
あなたはおそらくそれ以上のものを捕まえるべきです。コールスタックのどこかでより特定の例外タイプを使用する場合は、同様にそれをキャッチしようとします。
コード考えてみましょう:
try
{
process();
}
catch (const SpecificException& ex)
{
std::cerr << "SpecificException occured: " << ex.what() << std::endl;
}
catch (const std::runtime_error& ex)
{
std::cerr << "std::runtime_error occured: " << ex.what() << std::endl;
}
catch (...)
{
std::cerr << "Unknown error occured!" << std::endl; // should never happen hopefully
}
と例外のspecificnessによって常にソートすることを忘れないでください - ランタイムが最初すなわち(例外を処理することができる最初のcatchブロックで停止するように、より専門的な/、最初の派生を例外タイプの一致またはそれのベースとなるブロックをキャッチします。
さて、あなたは両方をキャッチすることができます:
int main() {
try {
// do stuff
}
catch(const std::exception& e) {
std::cout << "Caught exception: " << e.what() << std::endl;
}
catch(...) {
std::cout << "Caught unknown exception." << std::endl;
}
}
あなたが行うことができ、クリーニングの品質がスローされた例外の関数です。
たとえば、自分自身を持ち上げる(おそらくstd::exception
から派生した;それをと呼ぶ)という例外は、非常に上手く処理することができます。
だから本当に、あなたは、これらのライン上のキャッチサイト
try {
/*whatever*/
} catch (fooexception& fe){
/*ToDo - handle my exception*/
} catch (std::exception& e){
/*ToDo - handle this generically*/
} catch (...){
/*Hum. That's bad. Let's do my best*/
}
があなたのレジャーで、これを拡張します。ある意味では、複数のcatch
ブロックがif
else
ブロックのように動作することを覚えておいてください。
アプリケーションがスローする例外をキャッチする必要があります。あなたはアプリケーションを書く人なので、あなただけ - そしてstackoverflow.comの誰も - 将来のアプリケーションが投げる可能性のある例外を知ることができます。 –
例外が伝播したときにスタックの巻き戻しが発生すると、実装定義になります。 'main'まで待っていれば、何もクリーンアップできないかもしれません。 – NathanOliver
@ NathanOliver - 例外が** main **で** catchされている場合、すべてが適切にクリーンアップされます。自動オブジェクトを破棄したり破棄したりすることがないように、 '** main'の中から**を伝播するときだけです(例外としてハンドラがないので' terminate'が呼び出されます)。 –