Форум программистов, компьютерный форум CyberForum.ru

Обработка сиситемного исключения - C++

Восстановить пароль Регистрация
 
Dady
2 / 2 / 0
Регистрация: 20.03.2012
Сообщений: 53
22.06.2012, 17:57     Обработка сиситемного исключения #1
Друзья как мне переделать код, чтобы была обработка сиситемного исключения? Нужно ещё кроме деления на 0, использовать другие исключения.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void main()
{ setlocale(LC_ALL,"Russian");
  float a,b,y;
  int cw = _controlfp(0, 0); //получить управляющее слово, заданное по умолчанию
  //разрешить обработку исключений с плавающей точкой
  cw &=~(EM_OVERFLOW | EM_UNDERFLOW | EM_INEXACT | EM_ZERODIVIDE | EM_DENORMAL);
  _controlfp(cw, _MCW_EM);   //установить новое управляющее слово
  //теперь можно обрабатывать исключения
  //EXCEPTION_FLT_OVERFLOW – при выполнении операции с плавающей точкой произошло переполнение;
  //EXCEPTION_FLT_UNDERFLOW – результат операции с плавающей точкой является числом, которое меньше минимально возможного числа с плавающей точкой;
  //EXCEPTION_FLT_INEXACT_RESULT – результат операции с плавающей точкой не может быть точно представлен десятичной дробью;
  //EXCEPTION_FLT_DIVIDE_BY_ZERO – попытка деления на ноль в операции с плавающей точкой;
  //EXCEPTION_FLT_DENORMAL_OPERAND – один из операндов с плавающей точкой является ненормализованным;
  __try
  {
        printf("Введите a:\n");
        scanf("%f",&a);
        printf("Введите b:\n");
        scanf("%f",&b);
        y=a/b;
        printf("a/b=%f\n",y);
    
                    //ошибка, деление на 0
  }
  __except(EXCEPTION_EXECUTE_HANDLER)
  {
    DWORD  ec = GetExceptionCode();  //получаем код исключения
    if (ec == EXCEPTION_FLT_DIVIDE_BY_ZERO)
      cout << "Exception float divide by zero." << endl;
    else
      cout << "Some other exception." << endl;
  }system("Pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2012, 17:57     Обработка сиситемного исключения
Посмотрите здесь:

исключения C++
C++ Выход за пределы массива, обработка исключения
C++ Исключения
C++ Проверка входных данных: вызов и обработка исключения
C++ Исключения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
22.06.2012, 18:21     Обработка сиситемного исключения #2
если я ничего не путаю, то использовать try/catch и _try/_catch одновременно нельзя. у них много отличий и служат они для разных целей. Попробовал
C++
1
2
3
4
5
6
7
8
9
10
11
try
    {
        _try
        {
 
        }       
    }
    catch(...)
    {
 
    }
вот ошибка "error C2713: Only one form of exception handling permitted per function"
Dady
2 / 2 / 0
Регистрация: 20.03.2012
Сообщений: 53
22.06.2012, 18:26  [ТС]     Обработка сиситемного исключения #3
Цитата Сообщение от cppGhost Посмотреть сообщение
использовать try/catch и _try/_catch одновременно нельзя
А где я использую catch?
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
22.06.2012, 18:38     Обработка сиситемного исключения #4
Значит я не понял вопрос. Вы сказали
Нужно ещё кроме деления на 0, использовать другие исключения
Под другими я понял именно исключения c++, а не глянул в код =)

вот тут кое-что есть
Андрей\
3 / 3 / 0
Регистрация: 13.12.2011
Сообщений: 22
23.06.2012, 02:45     Обработка сиситемного исключения #5
Доброе время суток. Как мне кажется после генерации исключения стоит продолжить ветвление

C++
1
2
3
4
5
6
if (ec == EXCEPTION_FLT_DIVIDE_BY_ZERO)
      cout << "Exception float divide by zero." << endl;
if (ec == EXCEPTION_FLT_OVERFLOW)
      cout << "Exception float OVERFLOW" << endl;
if (ec == EXCEPTION_FLT_DENORMAL_OPERAND)
      cout << "Exception float DENORMAL_OPERAND" << endl;
или вы не это имели ввиду?
P.S. не могу проверить у себя т.к. при компиляции происходит переполнение стэка строка(_controlfp(cw, _MCW_EM); )
как только решу проблему отпишусь
Yandex
Объявления
23.06.2012, 02:45     Обработка сиситемного исключения
Ответ Создать тему
Опции темы

Текущее время: 14:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru