2016-05-06 5 views
1

私はC++でコマンドラインアプリケーションを作成しています。未処理の例外が発生した場合、私はアプリがひどくクラッシュするのを避けたいが、可能な限りクリーンアップしてエラーメッセージを表示する。C++のコマンドラインアプリケーションで、トップレベルで例外をキャッチする方法はありますか?

プログラムがクラッシュするのを防ぐために、トップレベルで例外をキャッチするにはどうすればよいですか? std::exception...などをキャッチする必要がありますか?

+2

アプリケーションがスローする例外をキャッチする必要があります。あなたはアプリケーションを書く人なので、あなただけ - そしてstackoverflow.comの誰も - 将来のアプリケーションが投げる可能性のある例外を知ることができます。 –

+0

例外が伝播したときにスタックの巻き戻しが発生すると、実装定義になります。 'main'まで待っていれば、何もクリーンアップできないかもしれません。 – NathanOliver

+2

@ NathanOliver - 例外が** main **で** catchされている場合、すべてが適切にクリーンアップされます。自動オブジェクトを破棄したり破棄したりすることがないように、 '** main'の中から**を伝播するときだけです(例外としてハンドラがないので' terminate'が呼び出されます)。 –

答えて

1

あなたはおそらくそれ以上のものを捕まえるべきです。コールスタックのどこかでより特定の例外タイプを使用する場合は、同様にそれをキャッチしようとします。

コード考えてみましょう:

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ブロックで停止するように、より専門的な/、最初の派生を例外タイプの一致またはそれのベースとなるブロックをキャッチします。

3

さて、あなたは両方をキャッチすることができます:

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; 
    } 
} 
4

あなたが行うことができ、クリーニングの品質がスローされた例外の関数です。

たとえば、自分自身を持ち上げる(おそらく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ブロックがifelseブロックのように動作することを覚えておいてください。

関連する問題