Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2010, 08:08   #1
Dima DD
 
Регистрация: 19.12.2010
Сообщений: 7
По умолчанию Delphi 7 + Windows Vista & 7: обработка исключений "деление на 0" (и др. мат. ошибок)

Здравствуйте!

Занимаюсь разработкой программ, использующих довольно сложные математические вычисления (сам работаю в Windows XP, Delphi 7). Мне необходимо некоторые функции "оборачивать" в try...except с отловом и обработкой мат. исключений + генерировать свои собственные исключения (т.к. функции таковы, что нельзя заранее предугадать их поведение с теми или иными наборами данных).

Пока мои юзеры работали в Windows XP, всё было отлично. Но с появлением у них Vista и 7-ки мат. ошибки типа "деление на 0" стали "проскакивать" через ловушки try...except, что приводит к различным прямым и косвенным неприятным последствиям (скажем, из визуального - к сообщениям об ошибках при работе с графиками в TeeChart и напрягающим юзеров значениям "NAN" и "INF" в таблицах вместо чего-то более осмысленного, но этим список не исчерпывается).

Вопрос: можно ли, и как правильнее отлавливать мат. ошибки в проекте Delphi 7, чтобы программы одинаково нормально работали и в XP, и в Vista с 7-кой?

Важное примечание: некоторым из юзеров до сих пор приходится работать в Win'98, так что переход на более новые версии Delphi пока что, наверное, не годится...
Dima DD вне форума Ответить с цитированием
Старый 19.12.2010, 09:55   #2
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Цитата:
стали "проскакивать" через ловушки try...except
А Вы сможете привести пример ?
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 19.12.2010, 10:11   #3
Dima DD
 
Регистрация: 19.12.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Kotofff Посмотреть сообщение
А Вы сможете привести пример ?
Да, конечно, напишу моделирующую программку. Но сначала должен сам проверить её, а это лишь завтра на работе, дома только Win XP стоят.
Dima DD вне форума Ответить с цитированием
Старый 19.12.2010, 10:50   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Если проскакивает попробуйте исползовать MadExcept отловит исключение и покажет, где оно происходит.
Человек_Борща вне форума Ответить с цитированием
Старый 19.12.2010, 10:55   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А почему именно try?
Разве не лучше не перехватывать ошибки а предупреждать их? Понаставить где нужно условий if, и защитить проход по программе в случае неудачного м.м.м. профита...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.12.2010, 12:02   #6
Dima DD
 
Регистрация: 19.12.2010
Сообщений: 7
По умолчанию

Прошу прощения, не указал очень важное, имхо, обстоятельство: отлов мат. исключений происходит в статически загружаемой DLL-ке! Я сейчас порылся и наткнулся на инфу (http://forum.sources.ru/index.php?showtopic=288074), что в таком случае и впрямь отлавливается только первое исключение, а последующие вызовы проскакивают (и это не только в Висте, но и в XP тоже...). Попробую воспользоваться данным там советом (принудительно вставить вызов процедуры Set8087CW($1332) в begin...end DLL-ки) и погляжу, как это отразится на работе программы. Что-то закралось подозрение, что дело у меня не только в мат. исключениях, а проблема более... ммм... комплексная...
Цитата:
Сообщение от Stilet Посмотреть сообщение
А почему именно try?
Разве не лучше не перехватывать ошибки а предупреждать их? Понаставить где нужно условий if, и защитить проход по программе в случае неудачного м.м.м. профита...
Тут особенность в том, что это - библиотека с большим и постоянно растущим количеством вычислительных алгоритмов от разных авторов (некоторые из них по неск. сотен операторов, некоторые выражения занимают по 7-10 строк, да ещё вложенность вызовов м.б. большой). Анализировать критические места каждого алгоритма в таком случае было бы неразумно - и слишком много излишнего кода, и сам "костяк" алгоритма становится "многоэтажным" (из-за этих if...then) и плохочитаемым, и времени на это гробится неоправданно много. Посему я таким образом (с if...then) обрабатываю только некоторые неявные ситуации (типа проверок на границы применимости алгоритмов) и всё равно и для таких случаев генерю собственные исключения - как раз, чтобы избавиться от этих многоэтажных if...then!
Вообще же, имхо, try...except - это как раз и есть очень удобный и лаконичный способ предупреждения мат. ошибок! Он хорош ещё и тем, что не пропустит то, что могу случайно не заметить я сам.
Dima DD вне форума Ответить с цитированием
Старый 19.12.2010, 17:07   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Т.е. у вас DLL возбуждает исключения, а exe ловит?

Если да, то собраны ли DLL и exe с run-time-пакетами (BPL) или без них? И как вы проводите анализ исключения и re-raise (покажите под в обоих except).
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 19.12.2010, 18:08   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и времени на это гробится неоправданно много.
Поверь мне ты сейчас гробишь еще больше времени бесцельно и впустую устраняя последствия, когда нужно предупреждать их причины.
Цитата:
Он хорош ещё и тем, что не пропустит то, что могу случайно не заметить я сам.
Смотри не разочаруйся, когда поймешь что не все то золото что по курсу доллара.
Цитата:
библиотека с большим и постоянно растущим количеством вычислительных алгоритмов от разных авторов
а не лучше ли от каждого автора по отдельной библиотеке?. И пусть каждый автор сам отвечает за правильную обработку исключений, их предупреждение и обработку.
Цитата:
Анализировать критические места каждого алгоритма в таком случае было бы неразумно
Это если анализ проводится главным руководителем. Да ему не с руки копирсаться в чужом и скорее всего кривом коде, выявляя слабые места - это найпрямейшая задача автора этого кода.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.12.2010, 20:29   #9
Dima DD
 
Регистрация: 19.12.2010
Сообщений: 7
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Т.е. у вас DLL возбуждает исключения, а exe ловит?

Если да, то собраны ли DLL и exe с run-time-пакетами (BPL) или без них? И как вы проводите анализ исключения и re-raise (покажите под в обоих except).
Не, всё очень просто! Я не передаю исключения из DLL в EXE - те, то возникают в DLL, там и обрабатываются, при этом DLL сообщает об их возникновении в EXE, просто устанавливая разные значения специально предназначенной для этого переменной (ErrorCode). А EXE тогда при необходимости возбуждает новые уже у себя.

DLL собираю со снятой галочкой "Build with runtime packages", т.е. ничего дополнительного для работы программы, по идее, не нужно.

Не знаю, надо ли приводить код, там всё достаточно стандартно: в DLL, в процедуре инициализации выбранного юзером алгоритма в единственный try...except обёрнут солидный (пока что почти на полторы сотни вариантов, но будет значительно больше) оператор case...end. В нём находятся вызовы подготовительных процедур для этих выбранных алгоритмов (они в основном вычисляют всякие константы). Эти подготовительные процедуры заодно присваивают значение процедурной переменной-функции GetValue, так что потом вызывается уже требуемый основной вычислительный метод. Тут тоже обработка мат. исключений разделена между DLL и EXE сходным образом: EXE обращается к одной и той же функции из DLL, а та в свою очередь вызывает GetValue, обёрнутую в try...except.

Вот по кр. мере в Win XP эта простая конструкция работает, как часики, никаких нареканий нету: деления на 0 или ln(0) возникают регулярно и часто (сам характер программы таков, что без них обойтись очень проблематично), в таблицах результатов пишется более-менее осмысленная информация и программа продолжает работать без задержек на эти конфузы (ну, не работают с юзерскими данными некоторые методы - и фиг с ними, ничего не поделать, прочитал - принял к сведению - забыл). А в Висте тормозящие работу окошки с красными крестиками стали пользователей донимать, и NAN с INF в таблицах вместо нормальных сообщений. Я было решил, что всё это связано с "проскоком" мат. исключений, но сейчас взяли сомнения, что дело только в них... Вот теперь думаю, как же это дело пооптимальнее локализовывать, ежели Дельфи 7 у меня на XP, а Висты-Семёрки - где-то на чужих компах...
Dima DD вне форума Ответить с цитированием
Старый 19.12.2010, 20:49   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Тогда когда функцию DLL вызывают, она должна выставить CW. Когда функция закончит управление - CW восстанавливает.

Ну и до кучи, ту же логику и в exe.

Плюс, заменить LoadLibrary на SafeLoadLibrary.

В целом, должно помочь.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"Vista и Apache на одном компьютере" или "кто сумел совместить" ? vedro-compota Операционные системы общие вопросы 20 30.01.2011 21:15
Что происходит на странице с такие JS: <script src="cmp.php?complete&amp;" id="las..." ...>? TwiX JavaScript, Ajax 0 05.02.2010 17:38
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
задачи по теме "Обработка строк" на Delphi 7 matrix8325 Помощь студентам 3 27.04.2009 09:47