![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отлов обработанных исключений... [D7]
Jolik © (2005-06-21 16:47:00)Можно ли (и если можно - то как) отловить возникшие исключения в блоке try ... except.
Поясню:
Хочу сделать лог файл (один на программу) и писать туда исключения. Чтобы не делать запись в лог в каждом блоке try ... except, можно ли сделать это гдето централизованно?
Спасибо!
Ega23 (2005-06-21 17:40:00) [1]2 Jolik © (21.06.05 17:31) [8]
Все верно - тока после raise Delphi прыгнет на конец процедуры, а если у меня после try ... except еще куча кода - он не выполнится... :(((
А на это finally секция есть.
try
try
i:=StrToInt(Edit1.Text);
ShowMessage(IntToStr(i));
except
raise Exception.Create('Бли-и-ин...');
end;
finally
Beep;
end;
Digitman (2005-06-21 17:37:00) [2]
> а если у меня после try ... except еще куча кода - он не
> выполнится
а с какого перепугу он должен выполниться ?
на то он и try..except ...
на то он и raise ...
ничто не мешает тебе вместо try..except обрабатывать исключения централизованно, в упомянутом обработчике события
там же анализировать класс исключения и инф-цию. связанную с тек.исключением ..
там же и "гасить" исключение установкой handled=true, если это требуется по твоему алгоритму
Jolik (2005-06-21 17:31:00) [3]To Ega23:
Все верно - тока после raise Delphi прыгнет на конец процедуры, а если у меня после try ... except еще куча кода - он не выполнится... :(((
Ega23 (2005-06-21 17:14:00) [4]2 Jolik © (21.06.05 17:07) [4]
Application.OnException отрабатывает только если сообщение не отработано - в блоках try ... except оно не вызывается :(((
Я же тебе сказал - raise надо делать.
Пример:
if refr or (not Qu.Active)
then try
if sql<>'*' then
if (Qu is TQuery)or(Qu is TRxQuery) then
begin
(Qu as TQuery).sql.Clear;
(Qu as TQuery).sql.Add(sql);
(Qu as TQuery).RequestLive:=false;
end;
RefreshQuery(Qu);
except on E:exception do
Begin
if mess='*' then ShowMessage(HMess.errQuery)
else if mess<>'' then ShowMessage(mess);
if (Qu is TRxQuery) then realsqltext:=(Qu as TRxQuery).realsql.Text;
if (Qu is TQuery) then realsqltext:=(Qu as TQuery).sql.Text;
if (Qu is TStoredProc) then realsqltext:=(Qu as TStoredProc).StoredProcName;
raise EGPException.Create(e.message+' '+mess+ ' '+realsqltext);
End;
evvcom (2005-06-21 17:11:00) [5]
> Delphi (IDE имеется ввиду) падла же знает
Ну так напиши свой отладчик! :)
Jolik (2005-06-21 17:08:00) [6]Delphi (IDE имеется ввиду) падла же знает, когда произошло исключение - даже обработанное...
Jolik (2005-06-21 17:07:00) [7]Application.OnException отрабатывает только если сообщение не отработано - в блоках try ... except оно не вызывается :(((
Некрасиво - в каждом try ... except записывать в лог :((( Обязательно забудешь написать, а потом будешь сидеть думать - как и что...
Ega23 (2005-06-21 16:54:00) [8]В догонку к Ega23 © (21.06.05 16:49) [1]
в секции except тогда raise надо будет делать, конечно...
Victor08 (2005-06-21 16:51:00) [9]Напиши процедуру записи в лог и запускай её в блоках Try except
Ega23 (2005-06-21 16:49:00) [10]Application.OnException надо переопределить.
Или воспользоваться компонентом TApplicationEvents