当我运行下面显示的简单程序时,我在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。我怀疑在这种情况下编译器的差异很重要。
答案 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应该可以解决您的问题。