在Cygwin上执行的程序不报告抛出的异常

时间:2014-06-25 07:15:00

标签: c++ ubuntu gcc cygwin outofrangeexception

当我运行下面显示的简单程序时,我在Cygwin和Ubuntu OS上得到不同的终端输出。

#include    <cstdio>
#include    <stdexcept>
#include    <cmath>

using namespace std;

double square_root(double x)
{
    if (x < 0)
        throw out_of_range("x<0");

    return sqrt(x);
}

int main() {
    const double input = -1;
    double result = square_root(input);
    printf("Square root of %f is %f\n", input, result);
    return 0;
}

在Cygwin上,与Ubuntu不同,我没有收到任何表明抛出异常的消息。可能是什么原因?我是否需要为Cygwin下载一些内容,以便它处理异常,因为它应该是什么?

我使用的是Cygwin版本1.7.30和GCC 4.9.0。在Ubuntu上,我有GCC 4.8.1版本13.10。我怀疑在这种情况下编译器的差异很重要。

3 个答案:

答案 0 :(得分:6)

这种情况没有定义行为 - 你依赖于&#34;善意&#34; C ++运行时为&#34发出了一些文本;你没有捕获异常&#34 ;,这确实是Linux的glibc所做的,显然Cygwin没有。

而是将主代码包装在try/catch中以处理throw

int main() {
    try
    {
        const double input = -1;
        double result = square_root(input);
        printf("Square root of %f is %f\n", input, result);
        return 0;
    }
    catch(...)
    {
        printf("Caught exception in main that wasn't handled...");
        return 10;
    }
}

一个很好的解决方案,正如Matt McNabb建议的那样,重命名主要&#34;并做一些像这样的事情:

int actual_main() {
    const double input = -1;
    double result = square_root(input);
    printf("Square root of %f is %f\n", input, result);
    return 0;
}

int main()
{
    try
    {
        return actual_main();
    }
    catch(std::exception e)
    {
         printf("Caught unhandled std:exception in main: %s\n", e.what().c_str());
    }
    catch(...)
    {
         printf("Caught unhandled and unknown exception in main...\n");
    }
    return 10;
}

请注意,我们返回的值不是零,表示&#34;失败&#34; - 我希望至少Cygwin已经做到了。

答案 1 :(得分:3)

由于您没有捕获异常,因此行为取决于实现/运行时。这似乎是针对Linux和cygwin实现的。

您应该自己捕获异常,或使用this问题的答案中解释的内容。

答案 2 :(得分:0)

调试这种C ++错误的一种方法是,只需将其重写为C,然后将其转换回C ++。 C更简单,因此将其转换为C应该可以解决您的问题。