Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.006 c
15-1261925324
xryst
2009-12-27 17:48
2010.03.14
нужно создать процедуру в делфи


9-1184674591
AlexanderMS
2007-07-17 16:16
2010.03.14
OpenGL или DirectX?


2-1262952216
Igor2100
2010-01-08 15:03
2010.03.14
Обработчик сообщений в DLL


15-1260999367
Германн
2009-12-17 00:36
2010.03.14
"Линия задержки"


15-1261691227
Юрий Зотов
2009-12-25 00:47
2010.03.14
Ура!!! Я написал троян, не нажав ни одной клавиши!!!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский