Я пытаюсь использовать механизм перехвата исключений в простом фрагменте кода 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 и сделайте несколько чисток и пересоберите без положительных результатов.
Пожалуйста, помогите, я посмотрел на соответствующие ответы, но я не могу определить проблему.
Деление на ноль не одно из событий, которое вызывает исключение в 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;