![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Exception [D7, XP]
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]Обязано дойти ..