Защита от переполнения типа данных
Модератор: Модераторы
- BamsikPotapov
- новенький
- Сообщения: 55
- Зарегистрирован: 31.12.2011 19:30:39
- Откуда: Меня в капусте нашли
Защита от переполнения типа данных
В результате математических операций у меня возникла ситуация что можно в программе ввести к примеру значение 50000 и программа пытается найти гиперболический тангенс этого аргумента. Возникает ошибка (SIGFPE External) как можно от этого защититься.
Первая идея у меня возникла просто проверить аргумент на значение.
Вторая это самому обработать исключение и действие на него, но как к нему подойти не знаю. Ведь мне нужно будет понять переполнение произошло или нет. Да и книга которую я прочитал сильно не помогла.
Если я напишу
try моя операция вычисления
except
сбросить все нафиг
end
Я не знаю какой тип исключения отвечает за переполнение данных
Так будет правильно? или есть способ лучше.
Первая идея у меня возникла просто проверить аргумент на значение.
Вторая это самому обработать исключение и действие на него, но как к нему подойти не знаю. Ведь мне нужно будет понять переполнение произошло или нет. Да и книга которую я прочитал сильно не помогла.
Если я напишу
try моя операция вычисления
except
сбросить все нафиг
end
Я не знаю какой тип исключения отвечает за переполнение данных
Так будет правильно? или есть способ лучше.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Ну так напиши после except:
on e: exception do writeln(e.classtype);
и узнаешь тип того исключения, которое нужно ловить.
Потом, если в блоке try находится несложный код (например, вычисление одной формулы), то после нее можно тупо ловить все исключения без разбора.
Наконец, математические исключения управляются процедурой SetExceptionMask из модуля Math, ненужные можно "замаскировать", но при этом переполнения будут приводить к результатам Inf и/или NaN (бесконечность / не число).
on e: exception do writeln(e.classtype);
и узнаешь тип того исключения, которое нужно ловить.
Потом, если в блоке try находится несложный код (например, вычисление одной формулы), то после нее можно тупо ловить все исключения без разбора.
Наконец, математические исключения управляются процедурой SetExceptionMask из модуля Math, ненужные можно "замаскировать", но при этом переполнения будут приводить к результатам Inf и/или NaN (бесконечность / не число).
- BamsikPotapov
- новенький
- Сообщения: 55
- Зарегистрирован: 31.12.2011 19:30:39
- Откуда: Меня в капусте нашли
Сергей спасибо. но еще добавлю для некоторых. Лазарус змеюка во время своей работы сам исключения обрабатывает, когда я его закрыл и запустил мой исполняемый файл все сработало как надо. Ну естественно я решил что не буду лезть в типы исключений и буду отлавливать всё и выполнять сброс.
- BamsikPotapov
- новенький
- Сообщения: 55
- Зарегистрирован: 31.12.2011 19:30:39
- Откуда: Меня в капусте нашли
При работе программы под Windows у меня проблем нет, при математических операциях идет олов ислючений try .... except ... end
Сегодня установил Linux Ubuntu и там исключения отлавливает система. Как справиться с этим я не понял. Подскажите как быть?
Можно поменять чтобы исключения отлавливала программа, а не операционная система?
Ислючения ловлю все, никакой конкретно тип мне не нужен.
Сегодня установил Linux Ubuntu и там исключения отлавливает система. Как справиться с этим я не понял. Подскажите как быть?
Можно поменять чтобы исключения отлавливала программа, а не операционная система?
Ислючения ловлю все, никакой конкретно тип мне не нужен.
Вообще это странно. Или надо ловить исключения другим способом или тупо не допускать ошибочных аргументов . Возможно существуют другие методы вычислений формул , где исключения обрабатываются правильно.
А вообще лучше выложить пример проекта с ошибкой.
А вообще лучше выложить пример проекта с ошибкой.
- BamsikPotapov
- новенький
- Сообщения: 55
- Зарегистрирован: 31.12.2011 19:30:39
- Откуда: Меня в капусте нашли
Простите сам накосячил, ошибка немного иная, виртуальная машина в маленьком окне открыта была не разглядел строку.
Linux ругался на Str(a:2:5,s);
a число
s переменная типа string
он в этом проблему находил Floating point overflow, просто в винде эта штука никогда не жаловалась, так я на неё и внимания не обращал. Может она в Linux по иному работает, всмысле макмильно возможных обрабатываемых значений.
Я добавил и эту строку в обработку исключений и все пошло
Еще раз извиняюсь
Linux ругался на Str(a:2:5,s);
a число
s переменная типа string
он в этом проблему находил Floating point overflow, просто в винде эта штука никогда не жаловалась, так я на неё и внимания не обращал. Может она в Linux по иному работает, всмысле макмильно возможных обрабатываемых значений.
Я добавил и эту строку в обработку исключений и все пошло
Еще раз извиняюсь
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Возможно, проявляется нюанс поведения x87: математическое исключение может бросаться не на той машинной инструкции, которая его реально вызывает, а на следующей инструкции fpu, которая вполне может оказаться и в другой процедуре.
Str() сама по себе не должна бросать исключений.
Str() сама по себе не должна бросать исключений.
- BamsikPotapov
- новенький
- Сообщения: 55
- Зарегистрирован: 31.12.2011 19:30:39
- Откуда: Меня в капусте нашли
Нефига не понятно, подробней напиши.
