Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отлов обработанных исключений... [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо