В течение нескольких дней я упорно борюсь (но напрасно) с масками-исключениями.
Я разработал приложение, которое выполняет тяжелые вычисления с плавающей запятой для сотен тысяч записей. Очевидно, что код должен уметь обрабатывать исключения, особенно связанные с вычислениями с плавающей запятой: Overflow, ZeroDivide и т. д.
Приложение корректно работает под Windows 7 (32-разрядная или 64-разрядная версия) со многими различными типами процессоров, при возникновении ошибки условие обрабатывается должным образом, возникает исключение и запись отбрасывается.
К сожалению, проблемы начинаются, когда я запускаю приложение именно там, где оно предназначено: на выделенном сервере с процессором Intel Xeon E5-2640 v2 и Windows Server 2003 R2. Здесь исключений не возникает: записи с ошибками не отбрасываются, поэтому результаты загрязняются теми числовыми значениями, которыми машина изображает +INF
или -INF
.
Проблема в том, что на сервере настройки маскирования ошибок по умолчанию отличаются от тех, что мы находим в Windows 7. В частности, при вызове процедуры GetExceptionMask
на сервере по умолчанию я нахожу exZeroDivide
, а при вызове GetExceptionMask
в Windows 7 это исключение не маскируется. В результате я сказал: при запуске приложения на сервере эти исключения не вызываются, а обрабатываются процессором, возвращающим экстремумы и «загрязняющие» числовые значения.
Ок, не паникуйте, я говорю, вы просто вызываете (т.е. в секции инициализации) SetExceptionMask
исключая exZeroDivide
, но не работает. Или лучше, хотя сразу после вызова SetExceptionMask
исключение exZeroDivide
больше не маскируется, когда выполняется код с вычислениями с плавающей запятой, набор TArithmeticExceptionMask
, возвращаемый GetExceptionMask
, все еще содержит exZeroDivide
, и поэтому, если возникает ошибка, исключение не возникает.
Может ли кто-нибудь сказать мне, как правильно называть SetExceptionMask
?
В чем причина того, что маскирование по умолчанию может отличаться от компьютера и другого? операционная система или тип процессора?
Спасибо.