![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка до перехвата исключения [D7, Win2k]
Валерий © (2006-06-02 04:19:00)Отправляю через IdTCPClient запрос на сервер.
Так как иногда бывают проблемы со связью - поставил ReadTimeOut.
Сделал try .. except для перехвата ошибок. Если ошибка типа неудачного коннекта или завершения - все нормально работает.
А когда ошибка из-за таймаута - вместо перехвата исключения и вывода моего сообщения - выдает системную ошибку.
Что делать? Что не так? Вот код:
try
IdTCPClient1.Connect;
idTCPClient1.SendCmd('GET http://site/123.php?id=1', -1);
finally
idTCPClient1.Disconnect;
end;
except
on E: EIdReadTimeout do
begin
ShowMessage('Ошибка: ' + E.Message);
end;
end;
Валерий (2006-06-02 11:23:00) [1]Извиняюсь - может я такой тормоз...
Запускаю компиляцию - выдает ошибку при таймауте.
Решил просто так проверить - что произойдет при аналогичной ситуации при запуске готового exe - выдал запланированное сообщение? А чего так?
Выходит, что вопрос решился, но все равно я не понял - почему при других ошибках и в Delphi выдает мои сообщения, а при таймауте - системное сообщение и прерывает работу?
Всем спасибо. Повозился - столько полезного раскопал :-)))
Валерий (2006-06-02 11:20:00) [2]Да нет - скрипт просто перебирает страницы (что-то типа примитивного поискового робота) на поиск конкретной инфы, которую и посылаю через GET. Так как на сервере траффик не важен - решил так сделать. Но такой перебор очень долго идет и ожидать в программе его окончания - неудобно. Можно дальше работать, а потом просто забрать из БД результат. Вот и бьюсь. Я же не зацикливаюсь на GET. Если можно через POST послать так чтобы не ожидать ответа - то хорошо.
Но я больше специалист по PHP, чем по Delphi и плохо представляю - как это осуществить
wal (2006-06-02 11:13:00) [3]
> [9] Валерий (02.06.06 11:09)
Ну я же не знаю, что у тебя большой скрипт делает. Например, нельзя GET-запросом сервис в даун отправлять. Кстати, на этом сайте какое-то время назад была история, когда на страничке администрирования сервера была ссылка на его выключение, а умный браузер решил эту ссылку загрузить и кэшировать, предполагая, что пользователь ее смотреть пойдет. Результат очевиден.
Валерий (2006-06-02 11:09:00) [4]Насчет маленького и большого скрипта - это я понял...
А что значит GET-запросы не должны существенно изменять состояние сервера?
wal (2006-06-02 11:06:00) [5]Значит на сервере идеология неправильная, правильно будет GET-запросом запустить маленький скрипт, который вернет ответ и запустит большой скрипт. А вообще, если все правильно делать, то GET-запросы не должны существенно изменять состояние сервера.
Валерий (2006-06-02 10:57:00) [6]Скрипт продолжает работу и результат отправляет в файл или БД (сейчас в БД). Эта часть работает. Собственно говоря - ставлю таймаут - idTCPClient1 коннектится к скрипту, потом из программы выкидывает с ошибкой, а через некоторое время (как и задумано) в БД появляется результат.
Просто есть скрипт, который ну очень долго будет работать - около 40 минут. Ждать в программе столько времени - неудобно.
wal (2006-06-02 10:49:00) [7]
> Мне нужно послать запрос на сервер и не обязательно, даже
> не желательно ждать ответ
А зачем тогда запрос посылать, если ответ не нужен?
Валерий (2006-06-02 10:40:00) [8]Блин, а как тогда мне сделать? Мне нужно послать запрос на сервер и не обязательно, даже не желательно ждать ответ, так в некоторых случаях это может занять слишком много времени.
А насчет GET - можно и на POST переделать, только если честно - я не представляю как послать тогда POST-запрос...
Сергей М. (2006-06-02 10:24:00) [9]HTTP Get-запрос подразумевает ожидание и получение ответа сервера.
Где в твоем коде это присутствует ?
REA (2006-06-02 10:19:00) [10]Поставь E: Exceptionи проверь ClassName. Не исключено, что это EIdProtocolReplyError
Валерий (2006-06-02 10:04:00) [11]Попробовал - все то же самое.
Если не сработал таймаут - выдает сообщение о grasfully, а если срабатывает таймаут - выкидывает с ошибкой
Сергей М. (2006-06-02 08:23:00) [12]try
IdTCPClient1.Connect;
try
idTCPClient1.SendCmd('GET http://site/123.php?id=1', -1);
finally
idTCPClient1.Disconnect;
end;
except
on E: Exception do
ShowMessage('Ошибка: ' + E.Classname + ' ' + E.Message);
end;