![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Martin_8 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 16.10.2006 Где: Минск Репутация: нет Всего: нет |
Здравствуйте, у меня вопрос по обработке исключений.
Я написал небольшую программку, по обработке деления на ноль. Но обработка ошибки деления на ноль не происходит, а в ответе я получаю странный результат. Подскажите, пожалуйста, что я делаю не так, и как мне правильно произвести перехват исключения.
|
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Martin_8, стандартные try/catch не ловят деление на ноль( как и многое другое ). Для таких вещей есть os-specific решения. Для Windows например:
|
|||
|
||||
| Martin_8 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 93 Регистрация: 16.10.2006 Где: Минск Репутация: нет Всего: нет |
Daevaorn, А применительно к консольному приложению, в моём случаи, как это должно выгладить?
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Я бы даже сказал архитектурно специфичные -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| UnrealMan |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Насколько я помню, деление на ноль значений с плавающей точкой никаких ошибок (в т.ч. SEH) не вызывает (результирующим значением будет +/–бесконечнось или неопределённость)
По-моему, это как бы для целочисленного деления (явно же написано: EXCEPTION_INT_DIVIDE_BY_ZERO). Martin_8, проверяй делитель на равенство нулю и в случае нулевого значения генерируй собственное исключение. Это сообщение отредактировал(а) UnrealMan - 3.12.2006, 21:43 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
UnrealMan,
правильно помнишь в Intel Architecture все операции с плавающей точкой выполняются FPU все, что происходит при делении на 0 - установка ZE в регистре состояния SR -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Microsoft говорит обратное: http://msdn.microsoft.com/library/default....l/floapoint.asp Другое дело, что это не работает. Не понятно почему.
Да, но есть и константа EXCEPTION_FLT_DIVIDE_BY_ZERO. |
||||
|
|||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Думаю это связано с тем, что в float операндах бессмыслено проверять делитель на 0 - тут может возникнуть ошибка и при ненулевых значениях, например если делится достаточно большое (почти пределеное) число на 0.0001 (последнее нулем не является).
Поэтому и ограничились ошибкой переполнения, которую и надо ловить... |
|||
|
||||
| UnrealMan |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Ну значит, я ошибся :-)
Небессмысленно – по крайней мере в ряде случаев.
Верно. И я бы такое обрабатывал примерно так (как дополнение к обработке нулевого знаменателя):
хотя можно и явно сравнивать с бесконечностями:
|
||||||||
|
|||||||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Исключение должно возникнуть уже в данной строке (если b = 0 или близко к нему):
float result = a/b; Я работаю на Билдере, при плавающих точках возникают два вида исключений: Если делитель = 0 - то деление на 0, а если близко к 0 - то переполнение. Их можно отловить с помощью try ... catch как в других средах, если честно не знаю. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |