Когда я запускаю простую программу, показанную ниже, я получаю разные выходные данные терминала в ОС 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. Я сомневаюсь, что разница в компиляторах имеет значение в этом случае.
Поскольку вы не перехватываете исключение, поведение зависит от реализации / времени выполнения. Похоже, что это реализовано по-разному для Linux и Cygwin.
Вы должны поймать исключение самостоятельно или использовать что-то, как описано в ответах на этот вопрос.
Поведение не определено для этого случая — вы полагаетесь на «доброту» среды выполнения 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 уже делает это.