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

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

Exception [D7, XP]


Страницы:   1 2

Andy BitOff (PPC) ©   (2008-10-29 13:37:00) 

Дожно ли исключение ESomeError возбужденное в SomeProc() дойти до его обработки в StartProcess?

procedure Tfrm_1.StartProcess();
begin
 try
   with Tfrm_Progress.Create(Self) do begin
     try
       ...
       if ShowModal = mrCancel then begin
         Raise ESomeError.Create('Прервано пользователем.');
       end;
       ...
     finally
       Free;
     end;
   end;
 except
   on E: ESomeError do Application.MessageBox(PChar(E.Message), 'Сообщение.', MB_ICONSTOP or MB_OK or MB_SYSTEMMODAL);
 end;
end;

юнит с Tfrm_Progress

procedure Tfrm_Progress.FormShow(Sender: TObject);
begin
 PostMessage(Handle, WM_StartSomeProc, 0, 0); // Собственно, запуск SomeProc()
end;

...

procedure Tfrm_Progress.SomeProc();
begin
 try
   try
     ...

   except
     on E: Exception do begin
       case ErrorCode of
         eseSomeErrorOne: begin
           Raise ESomeError.Create('ля-ля-ля' + #13#10 + E.Message);
         end;
         eseSomeErrorTwo: begin
           Raise ESomeError.Create('ля-ля-ля' + opName + #13#10 + E.Message);
         end;
       else
         Raise;
       end;
     end;
   end;
 finally
   ...
   ModalResult := mrOk;
 end;
end;


Сергей М.   (2008-10-29 14:40:00) [1]


> Andy BitOff (PPC)   (29.10.08 14:28) [19]


Тогда, пожалуй, прав han_malign ©   (29.10.08 14:15) [15] - в этой ситуации исключение направляется прямиком на обработку объектом Application


Поросенок Винни-Пух   (2008-10-29 14:29:00) [2]

а ну да. не заметил.
но все равно код слишком замудрен и витиеват с этими каскадными возбуждениями.


Andy BitOff (PPC)   (2008-10-29 14:28:00) [3]

Сергей М. ©
Отладчиком. Брэкпоинтами. Результатом.

Поросенок Винни-Пух ©
Если я правильно понял вопрос, то в одной.

Сорри за костноязычностьж Сложно с кпк набирать


Сергей М.   (2008-10-29 14:23:00) [4]


> Поросенок Винни-Пух ©   (29.10.08 14:20) [17]


Нет, я имел ввиду другое - PostMessage отправляет сообщение окну того же потока


Поросенок Винни-Пух   (2008-10-29 14:20:00) [5]

С какого перепугу ?

С прастова.
ключевые слова в тексте вопроса "ShowModal" "Progress"


han_malign   (2008-10-29 14:20:00) [6]

- вообще не возьмусь предсказать реакцию ситемы на исключение в API-шном callback-е (DispatchMessage{ user32{WndProc{raise}}}) - скорее всего приложение будет снято...


han_malign   (2008-10-29 14:15:00) [7]

procedure TWinControl.MainWndProc(var Message: TMessage);
begin
  try
   try
     WindowProc(Message);
   finally
     FreeDeviceContexts;
     FreeMemoryContexts;
   end;
  except
   Application.HandleException(Self);
 end;
end;


Сергей М.   (2008-10-29 14:15:00) [8]


> Поросенок Винни-Пух ©   (29.10.08 14:13) [13]


С какого перепугу ?


Поросенок Винни-Пух   (2008-10-29 14:13:00) [9]

Что почитать, чтобы правилно написать?

А у тебя вообще все это в рамках одной нитки или нет?
Что-то мне внутри меня подсказывает, что procedure Tfrm_ Progress.SomeProc(); - это другая нить.


Сергей М.   (2008-10-29 14:11:00) [10]


> Поросенок Винни-Пух ©   (29.10.08 14:05) [9]


> то будет просто else raise


Ну и что ?

Все равно оно обязано дойти до обработчика уровнем выше, каким бы оно ни было.

А фильтрация, т.е. ловля конкретно интересующего исключения, - это другой вопрос


Сергей М.   (2008-10-29 14:08:00) [11]


> Andy BitOff (PPC)   (29.10.08 14:05) [10]


Рассказывай, как ты это определил ..


Andy BitOff (PPC)   (2008-10-29 14:05:00) [12]

Сергей М. ©
Я тоже так думаю, но не доходит =(

Поросенок Винни-Пух ©
Что почитать, чтобы правилно написать?


Поросенок Винни-Пух   (2008-10-29 14:05:00) [13]

где гарантия что

case ErrorCode of

пойдет по нужной ветке?

если по ненужной пойдет, то будет просто else raise;


Сергей М.   (2008-10-29 14:04:00) [14]


> а внизу по else Raise райзится просто Exception


А по барабану что там райзится.
Все равно оно дойдет до except-блока в методе StartProcess.
Отсутствие соотв.фильтра в except-блока в методе StartProcess - это другой вопрос


Поросенок Винни-Пух   (2008-10-29 14:04:00) [15]

Если перевозбуждается именно ESomeError,

Вот именно.
А если не перевозбуждается?


Сергей М.   (2008-10-29 14:02:00) [16]


> Поросенок Винни-Пух ©   (29.10.08 13:55) [4]


А какая разница, перевужбуждено оно или нет ?

Если перевозбуждается именно ESomeError, то оно обязано (как и любое другое) дойти до except-блока в методе StartProcess и там обнаружено фильтром on E: ESomeError do ..


Поросенок Винни-Пух   (2008-10-29 14:01:00) [17]

... а на наверху ловится только ESomeError.

а внизу по else Raise райзится просто Exception


Поросенок Винни-Пух   (2008-10-29 13:55:00) [18]

Потому что перевозбуждение условное, а базовое уже обработано.


Andy BitOff (PPC)   (2008-10-29 13:47:00) [19]

Поросенок Винни-Пух ©
Почему?


Сергей М.   (2008-10-29 13:42:00) [20]

Обязано дойти ..


Страницы:   1 2

Наверх

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