Форум: "Начинающим";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];
ВнизОбработка исключительных ситуаций без SysUtils Найти похожие ветки
← →
Bopros (2006-01-14 22:48) [0]Необходимо обработать исключительную ситуацию без использования модуля 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.
← →
Bopros (2006-01-14 23:08) [1]нашёл, читаю
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=833
← →
Bopros (2006-01-14 23:46) [2]а никто готовым примером не поможет?
← →
Джо © (2006-01-15 00:42) [3]> [2] Bopros (14.01.06 23:46)
> а никто готовым примером не поможет?
Так в статье ж вроде и примеры имеются.
← →
NightAngel (2006-01-15 00:48) [4]Можно обработать исключения через SEH без использования каких-либо модулей. В конечном итоге все конструкции типа try..except, try..catch, сводятся примерно к следующему (с небольшими вариациями):
PUSH OFFSET HANDLER
PUSH FS:[0]
MOV FS:[0],ESP
... // Здесь код, в результате выполнения которого может возникнуть исключение
POP FS:[0]
ADD ESP,4h
RET
HANDLER:
... // Здесь код обработчика исключения
MOV EAX,1 // если eax==1 управление передаётся следующему обработчику в цепочке
RET
← →
Bopros (2006-01-15 12:31) [5]вообщем подкрепил err.pas из KOL и заработало все ок, и exe вырос не намного
← →
Bopros (2006-01-15 12:32) [6]2 NightAngel
а можешь всё таки дать кусок кода для делфи для обработки вида
try
except
end;
?
← →
Bopros (2006-01-16 15:17) [7]никто не поможет с кодом чтобы по минимум было?
← →
Digitman © (2006-01-16 15:23) [8]
> кусок кода для делфи для обработки вида
> try
> except
> end;
Ты еще не осознал, какую глупость ты сморозил при этом ?
← →
Игорь Шевченко © (2006-01-16 16:09) [9]
> Можно обработать исключения через SEH без использования
> каких-либо модулей. В конечном итоге все конструкции типа
> try..except, try..catch, сводятся примерно к следующему
> (с небольшими вариациями):
А finally ?
← →
Владислав © (2006-01-16 16:43) [10]А finally вроде и без SysUtils работает...
← →
Игорь Шевченко © (2006-01-16 17:26) [11]Владислав © (16.01.06 16:43) [10]
except тоже работает без SysUtils.
"Normal exception support comes from the SysUtils unit, which must be initialized before such support is available. " (c) F1
← →
Bopros (2006-01-17 15:02) [12]
> Digitman © (16.01.06 15:23) [8]
>
>
> > кусок кода для делфи для обработки вида
> > try
> > except
> > end;
>
>
> Ты еще не осознал, какую глупость ты сморозил при этом ?
>
и какую же интересно?
> Игорь Шевченко © (16.01.06 17:26) [11]
>
> Владислав © (16.01.06 16:43) [10]
>
> except тоже работает без SysUtils.
и где же работает? попробуй выполнить код, который в первом моём сообщении.
← →
Игорь Шевченко © (2006-01-17 15:25) [13]Bopros (17.01.06 15:02) [12]
Да, не работает, это я малось погорячился. InitExceptions надо прикручивать, можно модифицированный.
← →
Bopros (2006-01-18 00:44) [14]и всё таки если вернуться к http://www.delphikingdom.com/asp/viewitem.asp?catalogid=833 у кого нибудь работает пример оттуда?
вот код, может подскажете что я делаю не так?
http://rafb.net/paste/results/PKDbFs88.html
http://rafb.net/paste/results/sD4v1d94.html
← →
Defunct © (2006-01-18 01:51) [15]> Bopros
Позвольте поинтересоваться, откуда такая неприязнь к SysUtils?
← →
Bopros (2006-01-18 09:40) [16]
> Defunct © (18.01.06 01:51) [15]
>
> > Bopros
>
> Позвольте поинтересоваться, откуда такая неприязнь к SysUtils?
>
пишу приложение на WinAPI
← →
Игорь Шевченко © (2006-01-18 11:52) [17]
> пишу приложение на WinAPI
пиши без try except
WinAPI исключений не возбуждает, проблем быть не должно.
← →
Bopros (2006-01-18 12:20) [18]ну мне надо Except
помогите пожалуйста разобраться с http://www.delphikingdom.com/asp/viewitem.asp?catalogid=833
← →
Владислав © (2006-01-18 12:31) [19]
> Игорь Шевченко © (18.01.06 11:52) [17]
> ...WinAPI исключений не возбуждает...
Хммм... А EnterCriticalSection к WinAPI отношение имеет?
← →
Игорь Шевченко © (2006-01-18 13:31) [20]Владислав © (18.01.06 12:31) [19]
Имеет. А эта функция возбуждает исключение ?
Bopros (18.01.06 12:20) [18]
> ну мне надо Except
InitExceptions надо прикручивать
← →
Владислав © (2006-01-18 13:47) [21]
> Игорь Шевченко © (18.01.06 13:31) [20]
>
> Имеет. А эта функция возбуждает исключение ?
Platform SDK:
Windows 2000/NT: In low memory situations, EnterCriticalSection can raise an exception.
← →
Владислав © (2006-01-18 13:49) [22]Могу ошибаться, но по моему, она (функция) не одна такая...
← →
Игорь Шевченко © (2006-01-18 13:55) [23]Владислав © (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 14:16) [24]Игорь, ну и? Что Вы хотели этим сказать? Я не понял.
P.S. Откуда вот это: "This function can raise EXCEPTION_POSSIBLE_DEADLOCK..."? Я не нашел.
← →
Игорь Шевченко © (2006-01-18 14:53) [25]Владислав © (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 15:46) [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 16:00) [27]> Игорь Шевченко ©
Исключения МОГУТ быть возбуждены в результате вызова многих функций из WinAPI. Даже банальноеWriteProfileString("",nil,nil)
вызываетEAccessViolation
в дебрях ntdll (на XP, по крайней мере).
← →
Игорь Шевченко © (2006-01-18 16:11) [28]Джо © (18.01.06 16:00) [27]
> Исключения МОГУТ быть возбуждены в результате вызова многих
> функций из WinAPI
Я извиняюсь, это их документированное поведение ?
В таком случае в документации давно бы было написано, что для корректной работы с функциями вам нужно обеспечить стандартную обработку исключений.
← →
Digitman © (2006-01-18 16:18) [29]
> какую же интересно?
Да ту самую.
Эти страшные слова "try", "except", "finally" без Делфи и без реализованного в ней Objectpascal-компилятора попросту бессмысленны.
← →
Игорь Шевченко © (2006-01-18 16:28) [30]Владислав © (18.01.06 15:46) [26]
В большинстве случаев функции API возбуждают исключения в тех случаях (кроме Access Violation из-за неверно переданных параметров, разумеется), когда стандартная обработки исключений Delphi"ской библиотекой времени выполнения не приведет к желаемому результату. Поэтому для того, чтобы не усложнять себе жизнь, а заодно и не усложнять код, разумно придерживаться правила, что функции API исключений не возбуждают.
← →
Джо © (2006-01-18 16:37) [31]> [28] Игорь Шевченко © (18.01.06 16:11)
> Я извиняюсь, это их документированное поведение ?
В документации на этот счет ничего не нашел. Однако, факт остается фактом. Передача пустой строки (или, если угодно, неверного параметра) возбуждает исключение. Соответственно, обработка может понадобиться, т.к. в противном случае нарушается ход выполнения программы.
← →
Владислав © (2006-01-18 16:50) [32]
> Джо © (18.01.06 16:37) [31]
Речь, я полагаю, не об этом. Речь о разумно написанной программе, которая не будет передавать подобные параметры.
← →
Джо © (2006-01-18 16:53) [33]> [32] Владислав © (18.01.06 16:50)
> Речь о разумно написанной программе,
> которая не будет передавать подобные параметры.
Да-дад. И еще раз: дадад.
Осталось вам открыть только один секрет: как писать программы без ошибок. И, попутно, отменить обработку исключительных ситуаций, которая, оказывается, не нужна, ибо надо писать программы так, чтобы они выполнялись без ошибок.
← →
Bopros (2006-01-18 16:56) [34]
> Игорь Шевченко © (18.01.06 13:31) [20]
>
> Владислав © (18.01.06 12:31) [19]
>
> InitExceptions надо прикручивать
а подробнее можно?
интересует что неправильно сдела относительно статьи
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-18 17:03) [35]
> Джо © (18.01.06 16:53) [33]
Заметьте, я этого не говорил. И тем более я не пытаюсь выкидывать обработку исключений из программ на Delphi.
А если говорить о конкретном, а не на отвлеченные темы...
Что нужно было бы написать в обработчике исключения, возникшего в приведенном Вами в 27 посте примере? И что нельзя было бы написать до вызова этого примера, чтобы такое исключение не возникло?
← →
Leonid Troyanovsky © (2006-01-18 17:08) [36]
> Джо © (18.01.06 16:37) [31]
> неверного параметра) возбуждает исключение. Соответственно,
> обработка может понадобиться, т.к. в противном случае нарушается
> ход выполнения программы.
Дык, он и так нарушается.
После AV в дебрях ntdll честной программе остается лишь завершиться.
Вот, собс-но, и вся обработка.
--
Regards, LVT.
← →
Игорь Шевченко © (2006-01-18 17:09) [37]Джо © (18.01.06 16:37) [31]
Джо © (18.01.06 16:53) [33]
В этом случае обработка исключений мало чем поможет, если передан неправильный параметр. Потому обработка исключений в данной конкретной ситуации есть бессмысленное замусоривание кода.
← →
Джо © (2006-01-18 17:11) [38]> [36] Leonid Troyanovsky © (18.01.06 17:08)
> Дык, он и так нарушается.
> После AV в дебрях ntdll честной программе остается лишь
> завершиться.
procedure TForm1.Button1Click(Sender: TObject);
begin
try
WriteProfileString("",nil,nil)
except
ShowMessage ("Function call failed.");
end;
ShowMessage ("Here we are!");
end;
Зачем честной программе завершаться после такого пустяка? ;)
← →
Игорь Шевченко © (2006-01-18 17:15) [39]Джо © (18.01.06 17:11) [38]
procedure TForm1.Button1Click(Sender: TObject);
begin
GetWindowThreadProcessId (Handle, Pointer(123456768));
end;
Запусти
> Зачем честной программе завершаться после такого пустяка?
> ;)
Чтобы программист исправил ошибку.
← →
Владислав © (2006-01-18 17:16) [40]
> Джо © (18.01.06 17:11) [38]
>
> ShowMessage ("Function call failed.");
Зачем пользователю программа, которая делает неверные вызовы функций, а потом об этом сообщает? :о)
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.05;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.014 c