Try () и catch () не работают; Программа вылетает и никогда не выполняет блок catch ()

Я пытаюсь использовать механизм перехвата исключений в простом фрагменте кода C ++, который специально делит на 0:

#include <iostream>
using namespace std;
const int DefaultSize = 10;

int main()
{
int top = 90;
int bottom = 0;
cout << "top / 2 = " << (top/ 2) << endl;
cout << "top / 3 = " << (top/ 3) << endl;

try
{
cout << "top divided by bottom = ";
cout << (top / bottom) << endl;
}
catch(...)
{
cout << "something has gone wrong!" << endl;
}
cout << "Done." << endl;
return 0;
}

Программа вылетает и не выполняет блок catch — В Eclipse я получаю стандартную ошибку:
0 [main] CPP166 8964 cygwin_exception :: open_stackdumpfile: трассировка стека дампов в CPP166.exe.stackdump.
Запустите программу в другой среде IDE NetBeans и сделайте несколько чисток и пересоберите без положительных результатов.
Пожалуйста, помогите, я посмотрел на соответствующие ответы, но я не могу определить проблему.

0

Решение

Деление на ноль не одно из событий, которое вызывает исключение в C ++.

Исключения, перечисленные в стандарте ISO:

namespace std {
class logic_error;
class domain_error;
class invalid_argument;
class length_error;
class out_of_range;
class runtime_error;
class range_error;
class overflow_error;
class underflow_error;
}

и вы думаете, что overflow_error было бы идеально для указания деления на ноль.

Но C++03 а также C++11 раздел 5.6 /4 конкретно укажите:

Если второй операнд / или же % ноль, поведение не определено.

если ты хочу исключение, вам придется кодировать его самостоятельно, например:

#include <stdexcept>

inline int intDiv (int num, int denom) {
if (denom == 0) throw std::overflow_error("DivByZero");
return num / denom;
}

и конвертировать ваши звонки из:

cout << (top / bottom) << endl;

чтобы:

cout << intDiv(top, bottom) << endl;
2

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


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