2016-04-15 11 views
4

プログラムはさまざまなステータスコードで終了することができます。
私は、このステータスコードに基づいて最終的なタスクを処理するすべての方法で、終了ハンドラをキャッチとしてバインドしたいと考えています。
終了ハンドラ内からステータスコードを送信することはできますか?
私が知る限り、No。この小さな例に示すようにstd :: on_exitがないのはなぜですか?

したがって、私は、ステータス値を取得することができません:

#include <iostream> 
#include <cstdlib> 

int Get_Return_Code(){ 
    //can this be implemented? 
    return 0; 
} 

void Exit_Handler() { 

    // how do I get the return code 
    // from within the exit heandler? 
    auto return_code = Get_Return_Code(); //? 

    // I'd like to make decisions based on the return code 
    // while inside my exit handler 
    if (return_code == EXIT_SUCCESS){ 
     std::cout << "perform exit successful tasks...\n"; 
    } 
    else { 
     std::cout << "perform exit failure tasks...\n"; 
    } 
} 

int main(int argc, char** argv) 
{ 
    //bind the exit handler routine 
    if (std::atexit(Exit_Handler)){ 
     std::cerr << "Registration failed\n"; 
     return EXIT_FAILURE; 
    } 

    //if an argument is passed, exit with success 
    //if no argument is passed, exit with failure 
    if (argc > 1){ 
     std::cout << "exiting with success\n"; 
     return EXIT_SUCCESS; 
    } 

    std::cout << "exiting with failure\n"; 
    return EXIT_FAILURE; 
} 

は、C++はまだon_exitを含んでいない理由はありますか?
私はWindowsの世界での相互互換性について懸念しています。コードベースに関してで


これを行うための私の目標、メモリ管理を必要としません。私たちは既存のコードベースを持っています。どこにでもexitステートメントがあります。プログラムがエラーで終了すると、そのエラーコードが意味することをユーザーに表示したいと思います。私の考えでは、これは主要なリファクタリングのない最速のソリューションです。

+0

不要なので、あなたは 'try/catch/finally'ブロックにコードをラップするだけで同じことができます。 exitハンドラは、言語が例外処理を持たない場合に必要です –

+0

あなた自身で 'exit()'を実装し、標準ライブラリのバージョンをオーバーライドし、あなたが望むことを実行した後で '_exit()'を呼び出すことができます。数値コード。私はこれが素晴らしいアイデアであるかどうかはわかりませんが、本当に必要ならば、あなたが望むものを手に入れる方法かもしれません。 –

+0

@PanagiotisKanavosちょうど 'try-catch'、C++では' finally'は必要ありません。 – juanchopanza

答えて

1

最も簡単で最もポータブルなソリューションは、シェルスクリプトや他のプログラムの中にプログラムをラップすることです。このラッピングスクリプトまたはプログラムは、終了コードをチェックして、適切なメッセージをユーザーに表示することができます。

+0

これは私たちの特定の問題のための最良の解決策です。 –

10

デストラクタによってクリーンアップタスクが実行され、コードがすべての状況(任意のスコープからreturnまたはthrow)で正常に戻ると想定されているためです。

at_exitは、RAIIに優しい世界でのパターンです。

mainから戻ってくるものに応じてロジックを実行したい場合は、mainから戻ってくるときに単純に実行してください。 main

+0

それは公正です。私の状況は本当にメモリ管理に関係していません。私たちは既存のコードベースを持っています。どこにでもexitステートメントがあります。プログラムがエラーで終了すると、エラーコードがユーザーに何を意味するのかを表示したいと思います。私の考えでは、これは主要なリファクタリングのない最速のソリューションです。 –

+0

メインから帰った後に何かしたい場合はどうですか? – Alex

+0

@Alex:あなたが戻ってくる前に、あなたが望むものを 'main'に入れることができました。 –

関連する問題