Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1137001120
guitarist
2006-01-11 20:38
2006.02.05
Книги по WinApi


15-1137004702
Хинт
2006-01-11 21:38
2006.02.05
Просмотр JPG на КПК


2-1137603437
Compton's G
2006-01-18 19:57
2006.02.05
ClientSocket


15-1137401234
Pazitron_Brain
2006-01-16 11:47
2006.02.05
Глобальные проблемы


8-1124933210
Исследователь
2005-08-25 05:26
2006.02.05
Попытка видеозахвата (DirectShow)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский