Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.14;
Скачать: CL | DM;

Вниз

Как правильно "захватить" исключение?   Найти похожие ветки 

 
Дмитрий С ©   (2010-01-13 07:02) [0]


FCodeException: Exception;

....

try
 { какой-то код, который может вызвать исключение }
except
 on E:Exception do
 begin
   { В этом месте нужно записать в FCodeException := E, но
   так, чтобы delphi не удалил его (не сделал ему Free, при выходе из
   области try except) }
 end;
end;


Вопрос: Как его так захватить?

И еще, нужно ли захваченному исключению делать FCodeException.Free, если где-то далее в коде я его поднимаю: raise FCodeException?

Все это нужно для отлавливания исключений в другом потоке и выводе информации о них в через основной поток после выполнения работы потока.


 
Leonid Troyanovsky ©   (2010-01-13 08:26) [1]


> Дмитрий С ©   (13.01.10 07:02)  

> Все это нужно для отлавливания исключений в другом потоке
> и выводе информации о них в через основной поток после выполнения
> работы потока.

А зачем показывать после?
В любом случае, ведение лога гораздо полезней.

Ну, а если показывать сейчас, то http://edn.embarcadero.com/article/10452

--
Regards, LVT.


 
Сергей М. ©   (2010-01-13 08:51) [2]

Можно поступить, например, так:


pExcptObj: Pointer;
..
try
..
except
// обработка алгоритмически ожидаемых исключений
on E:EException1 do ..;
on E:EException2 do ..;
..
on E:EExceptionN do ..;
else
// захват любого неожиданного и потому необработанного исключения
// Суть захвата - инкремент сч-ка ссылок на объект исключения, так что теперь он не будет автоматически разрушен при выходе из except-блока
pExcptObj := AcquireExceptionObject;
// потокобезопасное внесение объекта в список
SyncAddToExcptObjList(pExcptObj);
разрушен
end;


..

Каждый элемент списка ExcptObjList впоследствии требует обязательной безусловной обработки: либо объект исключения разрушается явно вызовом Free (без ре-райза) либо неявно (при ре-райзе)


 
Дмитрий С ©   (2010-01-13 09:30) [3]


> Сергей М. ©   (13.01.10 08:51) [2]

Т.е. Я сначала делаю
pExcptObj := AcquireExceptionObject;
SyncAddToExcptObjList(pExcptObj);

Затем либо pExcptObj.Free должен сделать, либо raise pExcptObj?
Он при этом удалиться из всех списков?


 
Сергей М. ©   (2010-01-13 10:08) [4]

Это твой список, и ты сам ответственен за удаление элементов этого списка.

А Free или raise нужны для уничтожение самого объекта исключения, ссылку на который ты поместил в список при вызове SyncAddToExcptObjList


 
Дмитрий С ©   (2010-01-13 10:14) [5]


> ссылку на который ты поместил в список при вызове SyncAddToExcptObjList

Я про этот список говорю. Как ссылку на объект исключения убрать из этого списка? Или он автоматически удалиться при вызове raise или Free ?


 
Сергей М. ©   (2010-01-13 10:42) [6]

> Как ссылку на объект исключения убрать из этого списка?
Смотря как у тебя будет организован этот список..


 
Дмитрий С ©   (2010-01-13 10:54) [7]

А, понял. У меня списка не требуется.
Вроде все понял, спасибо.
Меня смутило наличие функции ReleaseExceptionObject, я думал, что его нужно освободить каким-то образом. Но реализация этой функции пустая.


 
Сергей М. ©   (2010-01-13 11:00) [8]


> реализация этой функции пустая


Как это "пустая" ?
Загляни в system.pas и убедись что это не так


 
Дмитрий С ©   (2010-01-13 11:07) [9]

У меня так:

Delphi 2010, system.pas:


function AcquireExceptionObject: Pointer;
type
 ExceptionAcquiredProc = procedure (Obj: Pointer);
var
 RaiseFrame: PRaiseFrame;
begin
 RaiseFrame := RaiseListPtr;
 if RaiseFrame <> nil then
 begin
   Result := RaiseFrame^.ExceptObject;
   RaiseFrame^.ExceptObject := nil;
   if Assigned(ExceptionAcquired) then
     ExceptionAcquiredProc(ExceptionAcquired)(Result);
 end
 else
   Result := nil;
end;

procedure ReleaseExceptionObject;
begin
end;


 
Дмитрий С ©   (2010-01-13 11:20) [10]

Так а зачем эта процедура нужна?


 
Сергей М. ©   (2010-01-13 11:47) [11]

Значит в D2010 это реализовано как-то по иному.
Но суть действий Acquire/Release остается неизменной: Acquire инкрементирует сч-к ссылок, а Release декрементирует



Страницы: 1 вся ветка

Текущий архив: 2010.03.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
1-1239541003
Дмитрий
2009-04-12 16:56
2010.03.14
Помогите найти описание StringCchPrintf


15-1261949422
Юрий
2009-12-28 00:30
2010.03.14
С днем рождения ! 28 декабря 2009 понедельник


4-1230275944
oleg_veles
2008-12-26 10:19
2010.03.14
Список копируемых файлов


15-1262036124
@!!ex
2009-12-29 00:35
2010.03.14
Объясните что делает команда


15-1261938570
Anatoly Podgoretsky
2009-12-27 21:29
2010.03.14
Литвин президент!