Форум: "Начинающим";
Текущий архив: 2010.03.14;
Скачать: [xml.tar.bz2];
ВнизКак правильно "захватить" исключение? Найти похожие ветки
← →
Дмитрий С © (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c