2

インタビューでこんな質問をされました。実行時エラーを引き起こすコードを受け取りました。たとえば。

main()
{
    main();
}

ここで、この実行時エラーを検出するコードを作成する必要があり、エラーを修正するように求められました。

実行時エラーを検出するために私が与えた答えは次のとおりです。

main()
{
    try
    { 
        main();
    }
    catch(std::runtime_error e) 
    {
    }
}

実行時エラーが検出された場合の問題を修正する方法を教えてください。私が考えることができる 1 つのアイデアは、安全に終了するために、catch ブロック内で「ユーザーにメッセージを表示し、exit(0) を呼び出す」ことです。より良い解決策はありますか?

4

3 に答える 3

2
int main() {
    static bool s_isMainCalled = false;
    if (s_isMainCalled) {
        // show error or print error or return the error to caller.
        return 1; // To indicate the recursion
    }

    s_isMainCalled = true;

    main();

    /* ???????????*/
    return 0;
}

上記のソースコードが実行可能ファイルにコンパイルされ、端末から呼び出されると仮定します。

# g++ recursive-test.c -o recursive-test

#./再帰テスト

#echo $? /*$? 最後に実行されたコマンドの戻り値があり、ここでは 1 が返されます */

(注: C++ では、例外を使用してスタック オーバーフローやセグメンテーション フォールトを処理することはできません)

于 2013-09-11T17:47:09.670 に答える
1

ここには実際にはコードがないため、エスケープする他のコードが実際には存在しないため、明確な答えはありません。私が考えることができる最善のことは、エラーメッセージを出力してプログラムを終了することです。おそらく、exit(0) を明示的に呼び出す代わりに (この場合はおそらく exit(1) にする必要があります)、プログラムを最後まで実行させますが、違いは些細なことです。

于 2013-09-11T17:17:46.883 に答える
0

他のコードが存在しない状態で自分自身を再帰的に呼び出すことと同等のセマンティックmain()は、無限スタックを想定できる場合、ほぼ無限ループになります。したがって、次のようなものです。

int main()
{ while (1); // or "for (;;);" or any one of many other alternate forms...
}

もちろん、エラーの原因となった条件が削除されているため、実際には「実行時エラーを検出する」わけではありません...

于 2013-09-11T19:01:33.473 に答える