![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка исключительных ситуаций без SysUtils [D6]
Bopros © (2006-01-14 22:48:00)Необходимо обработать исключительную ситуацию без использования модуля SysUtils, вот элементарный пример, который выдаёт Runtime error 200:
program Project1;
uses
Windows;
var b:integer;
begin
try
b:=trunc(b/0);
except
MessageBox(0,'123','321',mb_ok);
end;
end.
Джо (2006-01-18 16:37:00) [21]> [28] Игорь Шевченко © (18.01.06 16:11)
> Я извиняюсь, это их документированное поведение ?
В документации на этот счет ничего не нашел. Однако, факт остается фактом. Передача пустой строки (или, если угодно, неверного параметра) возбуждает исключение. Соответственно, обработка может понадобиться, т.к. в противном случае нарушается ход выполнения программы.
Игорь Шевченко (2006-01-18 16:28:00) [22]Владислав © (18.01.06 15:46) [26]
В большинстве случаев функции API возбуждают исключения в тех случаях (кроме Access Violation из-за неверно переданных параметров, разумеется), когда стандартная обработки исключений Delphi'ской библиотекой времени выполнения не приведет к желаемому результату. Поэтому для того, чтобы не усложнять себе жизнь, а заодно и не усложнять код, разумно придерживаться правила, что функции API исключений не возбуждают.
Digitman (2006-01-18 16:18:00) [23]
> какую же интересно?
Да ту самую.
Эти страшные слова "try", "except", "finally" без Делфи и без реализованного в ней Objectpascal-компилятора попросту бессмысленны.
Игорь Шевченко (2006-01-18 16:11:00) [24]Джо © (18.01.06 16:00) [27]
> Исключения МОГУТ быть возбуждены в результате вызова многих
> функций из WinAPI
Я извиняюсь, это их документированное поведение ?
В таком случае в документации давно бы было написано, что для корректной работы с функциями вам нужно обеспечить стандартную обработку исключений.
Джо (2006-01-18 16:00:00) [25]> Игорь Шевченко ©
Исключения МОГУТ быть возбуждены в результате вызова многих функций из WinAPI. Даже банальноеWriteProfileString('',nil,nil)вызываетEAccessViolationв дебрях ntdll (на XP, по крайней мере).
Владислав (2006-01-18 15:46:00) [26]Ну хорошо. Откинем ситуацию low memory.
Цитата от туда же:
"Reading and Writing From a File View. (Здесь речь о memory mapped files).
...
Reading from or writing to a file view can cause an exception."
Это я все к тому, что нужно очень внимательно читать WinAPI и отбрасывать некоторые удобные средства ОС, ради того, чтобы быть уверенным, что у нас WinAPI без исключительных ситуаций? Это ведь тоже не подход.
P.S. Спасибо за ссылку. Не знал я о декабрьском апдейте. Крайний раз ставил Platform SDK осенью с диска, что присылает Microsoft. Там еще был февраль 2003.
Игорь Шевченко (2006-01-18 14:53:00) [27]Владислав © (18.01.06 14:16) [24]
> Что Вы хотели этим сказать? Я не понял.
Я поясню. Функции WinAPI не ориентируются на обработку исключительных ситуаций. И при их вызове тоже не надо ориентироваться на обработку. В случае Low Memory, например, стандартная обработка исключений Delphi скорее всего вызовет исключение из-за невозможности создать объект Exception, поэтому применительно к данной ситуация обработка бесполезна.
> Откуда вот это: "This function can raise EXCEPTION_POSSIBLE_DEADLOCK.
> .."?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/entercriticalsection.asp
Владислав (2006-01-18 14:16:00) [28]Игорь, ну и? Что Вы хотели этим сказать? Я не понял.
P.S. Откуда вот это: "This function can raise EXCEPTION_POSSIBLE_DEADLOCK..."? Я не нашел.
Игорь Шевченко (2006-01-18 13:55:00) [29]Владислав © (18.01.06 13:47) [21]
This function can raise EXCEPTION_POSSIBLE_DEADLOCK if the critical section is corrupt or deadlock detection is enabled. Do not handle this exception; either continue execution or debug the application.
Windows 2000/NT: In low memory situations, EnterCriticalSection can raise an exception. To avoid problems, use structured exception handling, or call the InitializeCriticalSectionAndSpinCount function to preallocate the event used by EnterCriticalSection instead of calling the InitializeCriticalSection function, which forces EnterCriticalSection to allocate the event.
Владислав (2006-01-18 13:49:00) [30]Могу ошибаться, но по моему, она (функция) не одна такая...
Владислав (2006-01-18 13:47:00) [31]
> Игорь Шевченко © (18.01.06 13:31) [20]
>
> Имеет. А эта функция возбуждает исключение ?
Platform SDK:
Windows 2000/NT: In low memory situations, EnterCriticalSection can raise an exception.
Игорь Шевченко (2006-01-18 13:31:00) [32]Владислав © (18.01.06 12:31) [19]
Имеет. А эта функция возбуждает исключение ?
Bopros (18.01.06 12:20) [18]
> ну мне надо Except
InitExceptions надо прикручивать
Владислав (2006-01-18 12:31:00) [33]
> Игорь Шевченко © (18.01.06 11:52) [17]
> ...WinAPI исключений не возбуждает...
Хммм... А EnterCriticalSection к WinAPI отношение имеет?
Bopros (2006-01-18 12:20:00) [34]ну мне надо Except
помогите пожалуйста разобраться с http://www.delphikingdom.com/asp/viewitem.asp?catalogid=833
Игорь Шевченко (2006-01-18 11:52:00) [35]
> пишу приложение на WinAPI
пиши без try except
WinAPI исключений не возбуждает, проблем быть не должно.
Bopros (2006-01-18 09:40:00) [36]
> Defunct © (18.01.06 01:51) [15]
>
> > Bopros
>
> Позвольте поинтересоваться, откуда такая неприязнь к SysUtils?
>
пишу приложение на WinAPI
Defunct (2006-01-18 01:51:00) [37]> Bopros
Позвольте поинтересоваться, откуда такая неприязнь к SysUtils?
Bopros (2006-01-18 00:44:00) [38]и всё таки если вернуться к http://www.delphikingdom.com/asp/viewitem.asp?catalogid=833у кого нибудь работает пример оттуда?
вот код, может подскажете что я делаю не так?
http://rafb.net/paste/results/PKDbFs88.html
http://rafb.net/paste/results/sD4v1d94.html
Игорь Шевченко (2006-01-17 15:25:00) [39]Bopros (17.01.06 15:02) [12]
Да, не работает, это я малось погорячился. InitExceptions надо прикручивать, можно модифицированный.
Bopros (2006-01-17 15:02:00) [40]
> Digitman © (16.01.06 15:23) [8]
>
>
> > кусок кода для делфи для обработки вида
> > try
> > except
> > end;
>
>
> Ты еще не осознал, какую глупость ты сморозил при этом ?
>
и какую же интересно?
> Игорь Шевченко © (16.01.06 17:26) [11]
>
> Владислав © (16.01.06 16:43) [10]
>
> except тоже работает без SysUtils.
и где же работает? попробуй выполнить код, который в первом моём сообщении.