Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.07;
Скачать: CL | DM;

Вниз

Exception   Найти похожие ветки 

 
Andy BitOff (PPC)   (2008-10-29 13:37) [0]

Дожно ли исключение 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 13:41) [1]

неа


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

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


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

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


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

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


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

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

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


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


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


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

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


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

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

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


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


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


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


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

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

case ErrorCode of

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

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


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

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

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


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


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


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


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


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


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


Ну и что ?

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

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


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

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

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


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


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


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


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

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


 
han_malign ©   (2008-10-29 14:20) [16]

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


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

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

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


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


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


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


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

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

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

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


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

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


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


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


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



Страницы: 1 вся ветка

Текущий архив: 2008.12.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.011 c
1-1202818070
JetuS
2008-02-12 15:07
2008.12.07
Алгоритм сравнения матриц


2-1225208737
Morpheus
2008-10-28 18:45
2008.12.07
Как обрабатывать щелчки по неактивным контролам?


1-1202807069
БарЛог
2008-02-12 12:04
2008.12.07
Где принтер по умолчанию в реестре?


2-1225201432
Zhekson
2008-10-28 16:43
2008.12.07
SaveDialog1.FileName


3-1210858706
Hiller
2008-05-15 17:38
2008.12.07
Транзакции в ADO