Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

try ... finally


Страницы:   1 2 3

Анонимщик ©   (2004-07-01 17:41:00) 

Как можно определить:

try

finally
// мы сюда попали нормальным образом или где-то после try было
// сгенерировано исключение?
end


Digitman   (2004-07-02 12:06:00) [21]


> Тимохов ©   (02.07.04 12:01) [25]


сам напиши)

перехват WinAPI-вызовов - избитая тема


Тимохов   (2004-07-02 12:01:00) [22]

А что это за функция такая SetProcAddress?
У меня в msnd ее нет.


Digitman   (2004-07-02 11:55:00) [23]


> Анонимщик


псевдокод в качестве иллюстрации возможного решения:

TRaiseException = function(..): ... ; stdcall;

OldRE: TRaiseException;
Obj: TObject;
..
function NewRaiseException(..): ... ; stdcall;
begin
 asm
   mov [Obj], eax;
 end;
 Result := OldRE(..);
end;

...

OldRE := GetProcAddress(hKernel, 'RaiseException');
SetProcAddress(hKernel, @NewRaiseException);
Obj := nil;
try
 Assert(False);
finally
 SetProcAddress(hKernel, @OldRE);
 if Assigned(Obj) then
  begin  
   Showmessage(Obj.ClassName);
   Obj := nil;
  end;
 ...
end;


Digitman   (2004-07-02 11:47:00) [24]


> Анонимщик ©   (02.07.04 10:49) [22]


перехват встроенной ф-ции @System.RaiseExcept либо API-ф-ции kernel32.RaiseException дает инф-цию об объекте исключения, адрес объекта доступен в регистре eax в момент передачи управления в точку перехвата


Анонимщик   (2004-07-02 10:49:00) [25]

Петрову.
Нет, не так.
Ладно, дискуссия закончена, не туда обратился. Всем спасибо.


Igorek   (2004-07-01 20:00:00) [26]

procedure TForm1.Button2Click(Sender: TObject);
var
 i:TList;
 EA: TObject;

 procedure F(CalledByException: Boolean);
 begin
   // мы сюда попали нормальным образом или где-то после try было
   // сгенерировано исключение?
   if CalledByException then
 end;

begin
 try
   i.Clear;
   //other code
   //...
 except
     F(True);
     raise;
 end;
 F(False);
end;


GuAV   (2004-07-01 19:29:00) [27]


> Плохиш ©   (01.07.04 19:15) [19]


> А ты проверь следующий код:)


> procedure TForm1.Button2Click(Sender: TObject);
> var
> i:TList;
> begin
>
> try
> try
>  i.Clear;
> except on E:Exception do
>  ShowMessage('Except');
raise;
> end;
> finally
>   ShowMessage('Finally');
> end;
> end;


Плохиш   (2004-07-01 19:15:00) [28]


> Ega23 ©   (01.07.04 18:34) [11]
> Проверь следующий код:


А ты проверь следующий код:


procedure TForm1.Button2Click(Sender: TObject);
var
i:TList;
begin

try
i.Clear;
except on E:Exception do
ShowMessage('Except');
end;
ShowMessage('Finally');
end;


Петров Денис   (2004-07-01 19:05:00) [29]

> Анонимщик ©   (01.07.04 18:45) [15]

Интересно. Раскрутка - это попытка выхода из защищенного блока до его окончания, так?
Попробую привести пример, хотя он лучше смотрится на C...

Раскрутка:


function f: integer;
begin
 EnterCriticalSection(cs);
 try
   ...
   // здесь код, потенциально вызывающий исключение
   ...
   Result := 0;
   Exit; // вот здесь будет включен механизм раскрутки
         // так как выход из защищенного блока будет произведен
         // до его окончания
 finally
   LeaveCriticalSection(cs);
 end;
end;


Нет раскрутки:


function f: integer;
begin
 EnterCriticalSection(cs);
 try
   ...
   // здесь код, потенциально вызывающий исключение
   ...
 finally
   LeaveCriticalSection(cs);
 end;
 Result := 0;
end;


Так что проблема решается не определением факта генерации исключения в защищенном блоке, а правильным построением логики работы кода. Так?


Анонимщик   (2004-07-01 18:56:00) [30]

Ладно, кому интересно, почитайте
http://asterra.by.ru/library/richter4ru/head23.htm
до AbnormalTermination и скажите, если есть соображения.


Ega23   (2004-07-01 18:47:00) [31]

Жестоко.

В смысле?


Анонимщик   (2004-07-01 18:45:00) [32]

Я же сказал, для воспрепятствования локальной раскрутки


Петров Денис   (2004-07-01 18:41:00) [33]

> Ega23 ©   (01.07.04 18:34) [11]
> GuAV ©   (01.07.04 18:36) [12]

Жестоко. Тогда уж
Sandman25 ©   (01.07.04 17:41) [1]
форева.

Вопрос в том, нафига? Просто по-человечески интересно, когда такое может понадобиться?


TUser   (2004-07-01 18:40:00) [34]

Да уж, дискуссия ...


GuAV   (2004-07-01 18:36:00) [35]


> если оно будет обработанов

А если там raise;то оно будет поднято снова.


Ega23   (2004-07-01 18:34:00) [36]

Как это поможет определить в блоке finally-end, было ли исключение, если оно будет обработанов во вложенном блоке try-except?

Проверь следующий код:

procedure TForm1.Button2Click(Sender: TObject);
var
i:TList;
begin

try
try
 i.Clear;
except on E:Exception do
 ShowMessage('Except');
end;
finally
  ShowMessage('Finally');
end;
end;


Петров Денис   (2004-07-01 18:30:00) [37]

> Анонимщик ©   (01.07.04 18:22) [9]

Хам.

> GuAV ©   (01.07.04 18:22) [8]

Как это поможет определить в блоке finally-end, было ли исключение, если оно будет обработанов во вложенном блоке try-except?


Анонимщик   (2004-07-01 18:22:00) [38]

Петров Денис
Слушай, не понимаешь ничего, так не лезь


GuAV   (2004-07-01 18:22:00) [39]


> Остроумно

Что остроумного? так же и есть.


Петров Денис   (2004-07-01 18:21:00) [40]

Анонимщик ©   (01.07.04 18:16) [3]

Зачем определять в блоке finally...end, было исключение или нет? Ведь в нем должны располагаться действия, выполняемые ВНЕЗАВИСИМОСТИ от того, было исключение, или нет.

Например, ты открыл файл, поработал с ним и в блоке try...finally
Какая разница, возникло исключение или нет? Ты же все равно должен будешь его закрыть.

> Ega23 ©   (01.07.04 18:17) [4]

Остроумно.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо