2

我在一次采访中被问到这个问题。我得到了一个会导致运行时错误的代码。例如。

main()
{
    main();
}

现在我必须编写一些代码来检测这个运行时错误,并且还被要求纠正错误。

我为检测运行时错误给出的答案是:

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

请告诉我如何解决一旦检测到运行时错误的问题。我能想到的一个想法是“向用户显示一条消息并在 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++ 递归测试.c -o 递归测试

#./recursive-test

#回声$?/*$?将有最后执行的命令的返回值,这里你会得到 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 回答