![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 19.12.2010
Сообщений: 7
|
![]()
Здравствуйте!
Занимаюсь разработкой программ, использующих довольно сложные математические вычисления (сам работаю в Windows XP, Delphi 7). Мне необходимо некоторые функции "оборачивать" в try...except с отловом и обработкой мат. исключений + генерировать свои собственные исключения (т.к. функции таковы, что нельзя заранее предугадать их поведение с теми или иными наборами данных). Пока мои юзеры работали в Windows XP, всё было отлично. Но с появлением у них Vista и 7-ки мат. ошибки типа "деление на 0" стали "проскакивать" через ловушки try...except, что приводит к различным прямым и косвенным неприятным последствиям (скажем, из визуального - к сообщениям об ошибках при работе с графиками в TeeChart и напрягающим юзеров значениям "NAN" и "INF" в таблицах вместо чего-то более осмысленного, но этим список не исчерпывается). Вопрос: можно ли, и как правильнее отлавливать мат. ошибки в проекте Delphi 7, чтобы программы одинаково нормально работали и в XP, и в Vista с 7-кой? Важное примечание: некоторым из юзеров до сих пор приходится работать в Win'98, так что переход на более новые версии Delphi пока что, наверное, не годится... |
![]() |
![]() |
![]() |
#2 | |
Участник клуба
Регистрация: 11.01.2009
Сообщений: 1,917
|
![]() Цитата:
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
|
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 19.12.2010
Сообщений: 7
|
![]() |
![]() |
![]() |
![]() |
#5 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
А почему именно try?
Разве не лучше не перехватывать ошибки а предупреждать их? Понаставить где нужно условий if, и защитить проход по программе в случае неудачного м.м.м. профита...
I'm learning to live...
|
![]() |
![]() |
![]() |
#6 | |
Регистрация: 19.12.2010
Сообщений: 7
|
![]()
Прошу прощения, не указал очень важное, имхо, обстоятельство: отлов мат. исключений происходит в статически загружаемой DLL-ке! Я сейчас порылся и наткнулся на инфу (http://forum.sources.ru/index.php?showtopic=288074), что в таком случае и впрямь отлавливается только первое исключение, а последующие вызовы проскакивают (и это не только в Висте, но и в XP тоже...). Попробую воспользоваться данным там советом (принудительно вставить вызов процедуры Set8087CW($1332) в begin...end DLL-ки) и погляжу, как это отразится на работе программы. Что-то закралось подозрение, что дело у меня не только в мат. исключениях, а проблема более... ммм... комплексная...
Цитата:
Вообще же, имхо, try...except - это как раз и есть очень удобный и лаконичный способ предупреждения мат. ошибок! Он хорош ещё и тем, что не пропустит то, что могу случайно не заметить я сам. |
|
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Т.е. у вас DLL возбуждает исключения, а exe ловит?
Если да, то собраны ли DLL и exe с run-time-пакетами (BPL) или без них? И как вы проводите анализ исключения и re-raise (покажите под в обоих except).
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
#8 | ||||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
Цитата:
Цитата:
Цитата:
I'm learning to live...
|
||||
![]() |
![]() |
![]() |
#9 | |
Регистрация: 19.12.2010
Сообщений: 7
|
![]() Цитата:
DLL собираю со снятой галочкой "Build with runtime packages", т.е. ничего дополнительного для работы программы, по идее, не нужно. Не знаю, надо ли приводить код, там всё достаточно стандартно: в DLL, в процедуре инициализации выбранного юзером алгоритма в единственный try...except обёрнут солидный (пока что почти на полторы сотни вариантов, но будет значительно больше) оператор case...end. В нём находятся вызовы подготовительных процедур для этих выбранных алгоритмов (они в основном вычисляют всякие константы). Эти подготовительные процедуры заодно присваивают значение процедурной переменной-функции GetValue, так что потом вызывается уже требуемый основной вычислительный метод. Тут тоже обработка мат. исключений разделена между DLL и EXE сходным образом: EXE обращается к одной и той же функции из DLL, а та в свою очередь вызывает GetValue, обёрнутую в try...except. Вот по кр. мере в Win XP эта простая конструкция работает, как часики, никаких нареканий нету: деления на 0 или ln(0) возникают регулярно и часто ![]() |
|
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Тогда когда функцию DLL вызывают, она должна выставить CW. Когда функция закончит управление - CW восстанавливает.
Ну и до кучи, ту же логику и в exe. Плюс, заменить LoadLibrary на SafeLoadLibrary. В целом, должно помочь.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
"Vista и Apache на одном компьютере" или "кто сумел совместить" ? | vedro-compota | Операционные системы общие вопросы | 20 | 30.01.2011 21:15 |
Что происходит на странице с такие JS: <script src="cmp.php?complete&" 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 |