![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
try..except [D6, WinXP]
Hit © (2005-10-18 13:19:00)Мастера, помогите.
Пишу код и решил заюзать raise вместо возвращения кода ошибки из функции. Все шло нормально, но потом на одной из процедур после raise, я вижу свое сообщение(отлаживаюсьс IDE), но дальше какой-то мусор вместо перехода в верхний обработчик ошибок:
Project test.exe faulted with message: 'application-defined exception (code 0x0eedfade) at 0x77e73887'. Process Stopped. Use Step or Run to continue.
Куда рыть?
Игорь Шевченко (2005-10-20 17:40:00) [1]procedure TThread.Synchronize(Method: TThreadMethod);
begin
FSynchronizeException := nil;
FMethod := Method;
SendMessage(ThreadWindow, CM_EXECPROC, 0, Longint(Self));
if Assigned(FSynchronizeException) then raise FSynchronizeException;
end;
е1 (2005-10-20 17:15:00) [2]
> Leonid Troyanovsky © (20.10.05 15:59) [45]
>
>
> > е1 (20.10.05 14:42) [42]
>
> > MessageBox вызывается без хендла родительского окна -
> в
> > немодальном режиме. неважгНО. в каком потоке будет создаваться
>
> > экно диалога.
>
>
> Исключение возбуждено, оно не обработано, т.к., не было
> выхода из except,
> от юзера требуется реакция (показан MessageBox).
> Но, первичный поток вполне может продолжать работу, т.к.
> модальный
> диалог показан немодально.
>
> Однако, даже если он был показан хоть трижды немодально,
> то это никак
> не препятствует дальнейшему выполнению приложения уже в
> неконсистентном
> состоянии (за счет необработанного исключения).
Леонид, ну это же демагогия.
Автору надо было получить исключение в доп. потоке. пример иллюстрирует это.
Дальше уже дело автора, что с этим исключением делать.
Естественно, его надо обработать и погасить.
Либо не обработать и передать для обработки в основной поток.
Но это уже совсем другая история.
Кроме того, в примере это исключение как раз и обработано.
Поэтоу не вижу в примере " неконсистентного состояния" ни при каких обстоятельствах.
И аргументы просто высосаны из пальца.
Не так ли?
Игорь Шевченко (2005-10-20 16:12:00) [3]Hit (20.10.05 15:40) [44]
> Все работает в потоке через Syncronize, мож я конечно намутил.
> Буду рад советам.
С этого момента желательно проиллюстрировать кодом. Хотя бы схематично, методы Execute, синхронизируемые методы.
Поток, он вообще-то нужен для параллельного выполнения чего-либо, а Synchronize, как следует из перевода, требуется для синхронного (в данном случае, с первичным потоком) выполнения кода. Поэтому мне и интересно, как выглядит тело потока(ов)
Leonid Troyanovsky (2005-10-20 15:59:00) [4]
> е1 (20.10.05 14:42) [42]
> MessageBox вызывается без хендла родительского окна - в
> немодальном режиме. неважгНО. в каком потоке будет создаваться
> экно диалога.
Исключение возбуждено, оно не обработано, т.к., не было выхода из except,
от юзера требуется реакция (показан MessageBox).
Но, первичный поток вполне может продолжать работу, т.к. модальный
диалог показан немодально.
Однако, даже если он был показан хоть трижды немодально, то это никак
не препятствует дальнейшему выполнению приложения уже в неконсистентном
состоянии (за счет необработанного исключения).
--
Regards, LVT.
ЗЫ Свое обещание я выполнил, контраргументы выслушал, и мой ответ
тому доказательство (хотя, это лишь рефрен).
Ну, и разрешите откланяться, достаточно уж.
Hit (2005-10-20 15:40:00) [5]
> Насколько я понял твой пост [3], подключение ты тоже выполняешь
> внутри Syncronize, в этом случае, как главная форма сможет
> отображать ход и ошибки подключения ?
у нее есть паблик функция, которой я передаю текст.
А остальные классы: датамодуль(коннект к базе), алгоритмы выдают или текст ошибки(я сам raise-ю или ексепшины) или пишу напрямую в палик функцию. Все работает в потоке через Syncronize, мож я конечно намутил. Буду рад советам.
Игорь Шевченко (2005-10-20 15:22:00) [6]Hit (20.10.05 14:17) [41]
> Поток мне нужен для подключения к БД.
Насколько я понял твой пост [3], подключение ты тоже выполняешь внутри Syncronize, в этом случае, как главная форма сможет отображать ход и ошибки подключения ?
Может быть, ты приведешь более полный код, чтобы можно было подсказать некое решение ?
е1 (2005-10-20 14:42:00) [7]
> Leonid Troyanovsky © (20.10.05 13:44) [40]
>
> Во-первых, свою точку зрения я обосновал
> (есть контраргументы - выслушаю).
> Во-вторых, я не провоцировал хамства
> (есть что-то личное - мой адрес в данных).
>
> --
> Regards, LVT.
Еще раз.
MessageBox вызывается без хендла родительского окна - в немодальном режиме. неважгНО. в каком потоке будет создаваться экно диалога.
Где-то здесь грабли? Если здесь, то в чем?
Код, приведенный в е1, совершенно рабочий, создан для демонстрации передачи исключения наверх.
Здесь грабли?
А так как в Leonid Troyanovsky © (20.10.05 09:14) [34] совершенно безосновательно написано в мой адрес
> Ходящие по граблям не должны на обижаться на то,
> что я промолчал.
лишь демонстрирует, что высказывание е1 (20.10.05 13:09) [37] о трындеже совершенно верно зарактеризует положение.
Не надо провозглашать истины без достаточных на то аргументов, даже если на фуражке голубая бляха.
Hit (2005-10-20 14:17:00) [8]
> [39] Игорь Шевченко © (20.10.05 13:33)
Поток мне нужен для подключения к БД. Когда недоступен сервер и т.п. ошибок(прога замирает на таймаут) мне нужно, что-бы главная форма появилась и туда в лог(Мемо) пошли сообщения : об ошибках, об этапах работы алгоритмов...
Leonid Troyanovsky (2005-10-20 13:44:00) [9]
> е1 (20.10.05 13:09) [37]
> И не только промолчал, но и не привел никаких аргументов
> в пользу своей точки зрения, т.е. - потрындел немного.
Во-первых, свою точку зрения я обосновал
(есть контраргументы - выслушаю).
Во-вторых, я не провоцировал хамства
(есть что-то личное - мой адрес в данных).
--
Regards, LVT.
Игорь Шевченко (2005-10-20 13:33:00) [10]Hit (18.10.05 14:36) [3]
> Есть поток, который в методе Synchronize дергает методы
> из других юнитов.
> Так вот, один такой метод(в котором трабл) выглядит так(упрощенно):
>
А нафига вообще в методе потока делать работу в Synchronize в твоем конкретном случае ?
В чем тогда смысл потока и возни с Exceptions ?
Synchronize же выполняет код в основном потоке, я, честно говоря, не вижу особой пользы от такого распараллеливания...
е1 (2005-10-20 13:11:00) [11]
> Leonid Troyanovsky © (20.10.05 09:14) [34]
Кроме того, повторю еще раз - код для примера, одноразовый. Единственно для того, чтобы показать, что Exception успешно передается на верхний уровень.
е1 (2005-10-20 13:09:00) [12]
> Leonid Troyanovsky © (20.10.05 09:14) [34]
>
>
> > е1 (19.10.05 17:40) [25]
>
> > Поэтому здесь коррректный и безопасный код.
>
>
> Ходящие по граблям не должны на обижаться на то,
> что я промолчал.
Совершенно верно.
И не только промолчал, но и не привел никаких аргументов в пользу своей точки зрения, т.е. - потрындел немного.
Hit (2005-10-20 10:54:00) [13]
> А может, ларчик проще открыть ? Возвращать код ошибки и
> не мучиться ?
Нет, там вся концепция на ексепшинах...
в общем набрался смелости и подправил функцию криптографии, там писали в строку ограниченной длинны без проверки границ... В общем добавил пару условий - и о чудо пошло!
Всем спасибо.
Игорь Шевченко (2005-10-20 10:12:00) [14]
> Пишу код и решил заюзать raise вместо возвращения кода ошибки
> из функции
А может, ларчик проще открыть ? Возвращать код ошибки и не мучиться ?
Leonid Troyanovsky (2005-10-20 09:14:00) [15]
> е1 (19.10.05 17:40) [25]
> Поэтому здесь коррректный и безопасный код.
Ходящие по граблям не должны на обижаться на то,
что я промолчал.
--
Regards, LVT.
Leonid Troyanovsky (2005-10-20 09:08:00) [16]
> Hit (19.10.05 16:23) [21]
> Локализовал проблему. Проблема не в потоках и ексепшинах.
> ..
Неточно локализовал.
Exception code 0x0eedfade - означает, что это исключение Windows,
сгенерированное RTL дельфи.
В первичном потоке подобные исключения проявились бы как привычные
Exception. Ну, а во вторичных потоках таких механизмов нет.
Ну, и kernel32 здесь особо ни причем.
--
Regards. LVT.
umbra (2005-10-19 19:21:00) [17]А если попробовать такую процедуру, то какое сообщение вылетает?
procedure TMyClass.DoSomething2();
var
LoacalVar1, crypted: String;
begin
try
//тут работаю с БД, читаю из БД LoacalVar1
...
except
ShowMessage('Database');
end;
try
crypted := UnitCrypt.Crypt(Param1, Param2, Param3)
except
ShowMessage('Crypt');
if (LocalVar1 = crypted)then
try
...
except
ShowMessage('Stuff');
end
else
begin
raise Exception.Create('Error in DoSomething2');
end;
end;
Hit (2005-10-19 18:14:00) [18]я ошибся...[27]
umbra (2005-10-19 18:08:00) [19]
> procedure Crypt(Param1, Param2, Param3: String)
>{.........................}
> Result := DoCryptItem(Result,Param1);
А какой в процедуре может быть Result?
Hit (2005-10-19 18:05:00) [20]
> А ты не комментируй, а защити блоком try..except и проверь,
> что за ошибка возникает.
так блин нету ж ошибки, вот в чем зараза... Функция UnitCrypt.Crypt еще раз говорю - работает... Это я генерю сам ексепшн, вместо того, чтобы вернуть фолсе...