![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
try ... finally
Анонимщик © (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]
Остроумно.