Программа, выполненная на Cygwin, не сообщает об исключении

Когда я запускаю простую программу, показанную ниже, я получаю разные выходные данные терминала в ОС Cygwin и Ubuntu.

#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 у меня есть версия 13.10 с GCC 4.8.1. Я сомневаюсь, что разница в компиляторах имеет значение в этом случае.

4

Решение

Поскольку вы не перехватываете исключение, поведение зависит от реализации / времени выполнения. Похоже, что это реализовано по-разному для Linux и Cygwin.

Вы должны поймать исключение самостоятельно или использовать что-то, как описано в ответах на этот вопрос.

3

Другие решения

Поведение не определено для этого случая — вы полагаетесь на «доброту» среды выполнения C ++, чтобы выдать некоторый текст для «вы не поймали исключение», что действительно делает glibc в Linux, и, очевидно, 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;
}
}

Хорошее решение, предложенное Мэттом МакНаббом, состоит в том, чтобы «переименовать главное» и сделать что-то вроде этого:

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;
}

Обратите внимание, что мы возвращаем значение, отличное от нуля, чтобы указать «сбой» — я ожидаю, что по крайней мере Cygwin уже делает это.

6

По вопросам рекламы [email protected]