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

Вниз

Ошибка до перехвата исключения   Найти похожие ветки 

 
Валерий   (2006-06-02 04:19) [0]

Отправляю через 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 08:23) [1]

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;


 
Валерий   (2006-06-02 10:04) [2]

Попробовал - все то же самое.
Если не сработал таймаут - выдает сообщение о grasfully, а если срабатывает таймаут - выкидывает с ошибкой


 
REA   (2006-06-02 10:19) [3]

Поставь E: Exception и проверь ClassName. Не исключено, что это EIdProtocolReplyError


 
Сергей М. ©   (2006-06-02 10:24) [4]

HTTP Get-запрос подразумевает ожидание и получение ответа сервера.
Где в твоем коде это присутствует ?


 
Валерий   (2006-06-02 10:40) [5]

Блин, а как тогда мне сделать? Мне нужно послать запрос на сервер и не обязательно, даже не желательно ждать ответ, так в некоторых случаях это может занять слишком много времени.
А насчет GET - можно и на POST переделать, только если честно - я не представляю как послать тогда POST-запрос...


 
wal ©   (2006-06-02 10:49) [6]


> Мне нужно послать запрос на сервер и не обязательно, даже
> не желательно ждать ответ
А зачем тогда запрос посылать, если ответ не нужен?


 
Валерий   (2006-06-02 10:57) [7]

Скрипт продолжает работу и результат отправляет в файл или БД (сейчас в БД). Эта часть работает. Собственно говоря - ставлю таймаут - idTCPClient1 коннектится к скрипту, потом из программы выкидывает с ошибкой, а через некоторое время (как и задумано) в БД появляется результат.

Просто есть скрипт, который ну очень долго будет работать - около 40 минут. Ждать в программе столько времени - неудобно.


 
wal ©   (2006-06-02 11:06) [8]

Значит на сервере идеология неправильная, правильно будет GET-запросом запустить маленький скрипт, который вернет ответ и запустит большой скрипт. А вообще, если все правильно делать, то GET-запросы не должны существенно изменять состояние сервера.


 
Валерий   (2006-06-02 11:09) [9]

Насчет маленького и большого скрипта - это я понял...
А что значит GET-запросы не должны существенно изменять состояние сервера?


 
wal ©   (2006-06-02 11:13) [10]


> [9] Валерий   (02.06.06 11:09)
Ну я же не знаю, что у тебя большой скрипт делает. Например, нельзя GET-запросом сервис в даун отправлять. Кстати, на этом сайте какое-то время назад была история, когда на страничке администрирования сервера была ссылка на его выключение, а умный браузер решил эту ссылку загрузить и кэшировать, предполагая, что пользователь ее смотреть пойдет. Результат очевиден.


 
Валерий   (2006-06-02 11:20) [11]

Да нет - скрипт просто перебирает страницы (что-то типа примитивного поискового робота) на поиск конкретной инфы, которую и посылаю через GET. Так как на сервере траффик не важен - решил так сделать. Но такой перебор очень долго идет и ожидать в программе его окончания - неудобно. Можно дальше работать, а потом просто забрать из БД результат. Вот и бьюсь. Я же не зацикливаюсь на GET. Если можно через POST послать так чтобы не ожидать ответа - то хорошо.
Но я больше специалист по PHP, чем по Delphi и плохо представляю - как это осуществить


 
Валерий   (2006-06-02 11:23) [12]

Извиняюсь - может я такой тормоз...
Запускаю компиляцию - выдает ошибку при таймауте.
Решил просто так проверить - что произойдет при аналогичной ситуации при запуске готового exe - выдал запланированное сообщение? А чего так?
Выходит, что вопрос решился, но все равно я не понял - почему при других ошибках и в Delphi выдает мои сообщения, а при таймауте - системное сообщение и прерывает работу?

Всем спасибо. Повозился - столько полезного раскопал :-)))



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

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

Наверх




Память: 0.49 MB
Время: 0.027 c
6-1149132298
BanderLog
2006-06-01 07:24
2006.10.29
Indy10 WriteFile и синхронизация


15-1160295530
ArtemESC
2006-10-08 12:18
2006.10.29
C C++


15-1160367972
Slider007
2006-10-09 08:26
2006.10.29
Про центры планирования семьи


15-1158760477
tovarish
2006-09-20 17:54
2006.10.29
Альтернатирвный StringGrid


2-1160837265
pathfinder
2006-10-14 18:47
2006.10.29
OpenFile