Для меня не очевидным был этот вопрос. Хотелось получить информацию об ошибке сервера на клиенте. То есть, примерно так…
Ведь idHTTPServer многопоточный, и значит, возбуждение исключения при ошибке можно было сделать так
Как обработать исключение из потока?
Но idHTTP и idHTTPServer почти всегда находятся в разных приложениях, и значит объекты Application у них разные. Поэтому такой способ не подойдет.
Но всё оказалось проще, чем я думал. Пришлось потратить какое-то время на нюансы. Но в целом, результат есть.
На idHTTPServer в CommandGet пишем следующее (имитируем ошибку деления на ноль)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
... SomeInteger:=12; Zero:=0; try SomeInteger:=Trunc(SomeInteger/Zero); except on E:Exception do begin AResponseInfo.ContentText:=‘Server Error ‘+‘Class=’+E.ClassName+‘ / Message=’+E.Message;// ‘testing ok’; AResponseInfo.WriteContent; raise Exception.Create(‘Server Error ‘+E.ClassName+E.Message); end; //AResponseInfo.ContentText:=’testing ok2′; //AResponseInfo.WriteContent; // this will not show testing ok2! end; ... |
Если мы напишем второй раз
//AResponseInfo.ContentText:=’testing ok2′; //AResponseInfo.WriteContent; // this will not show testing ok2! |
Данные инструкции, то на клиент сообщение “testing ok2′ не попадет, я так понимаю WriteContent можно использовать в данном случае один раз. Можно покопаться в исходниках и понять почему.
На клиенте наше исключение попадает в результат метода POST компонента idHTTP
MyServerResponse:=idHTTP.Post(HTTPServerToRequest+‘/CreateDirOnServer’, PostData); |
Ну а далее, если это скажем, не тот ответ сервера, который нам нужен, на клиенте мы просто возбуждаем исключение с сообщением от сервера, скажем, так
if MyServerResponse<>‘ok’ then raise Exception.Create(MyServerResponse); |
И отлавливаем его в except блоке на клиенте, примерно так (пример из проекта)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
{Creating dir on Server} procedure THTTPRequests.CreateDirOnServer(dir:string; MyServerResponse:string); var PostData: TIdMultiPartFormDataStream; FileName:string; Error:string; ResponseText:string; begin if not IsHTTPConnectionOk(Error,ResponseText) then Exit; with VisualFrame_HTTP_UnitVar do begin begin PostData := TIdMultiPartFormDataStream.Create; try idHTTP.Request.Referer := HTTPServerToRequest+‘/CreateDirOnServer’; // ‘http://localhost:40000/sendfile’; // http://www.link.net/download’; idHTTP.Request.ContentType := ‘multipart/form-data’; PostData.AddFormField(‘Login’, ‘SomeLogin’); PostData.AddFormField(‘Password’, ‘SomePassword’); PostData.AddFormField(‘DirectoryToCreate’, dir); // PostData.AddFile(‘attach’, FileName, ‘application/x-rar-compressed’); // PostData.AddFormField(‘action’, ‘post’); try MyServerResponse:=idHTTP.Post(HTTPServerToRequest+‘/CreateDirOnServer’, PostData); if MyServerResponse<>‘ok’ then raise Exception.Create(MyServerResponse); Application.ProcessMessages; except on E:EidHttpProtocolException do begin ShowMessage( ‘EidHttpProtocolException: ‘ + E. Message); end; on E: EIdException do begin ShowMessage( ‘An network error occurred while trying to connect: ‘ + E. Message); end; on E: Exception do begin ShowMessage( ‘An unknown error occurred while trying to connect: ‘ + E. Message); end; end; finally if(Assigned(PostData)) then PostData.Free; // ShowMessage(‘idHTTP Sent OK’); end; end; end; end; |
Вот в принципе и всё!
This entry was posted in Delphi, Indy. Bookmark the permalink.
I’m writing a program to perform checks on websites to test they’re current status, e.g. 200 OK. I’m using Indy HTTP shipped with Delphi 2010 for this task and have the current code.
procedure TCheckSiteIndividual.Execute;
var
http : TIdhttp;
begin
try
try
http := Tidhttp.create(nil); //Create indy
http.Get(CSiteURL,nil); //Send Request To Check Site
except
on E: EIdHTTPProtocolException do
status := http.ResponseText; // or: code := E.ErrorCode;
end;
status := http.ResponseText; //Return Status of Site
synchronize(updateform); //Update data to form
finally
http.Free;
end;
end;
The CSiteURL
variable is set in the Thread Constructor, and the status
variable is a variable to the entire thread.
The try, except parts of this code came from Remy Lebeau — TeamB here which was a question I asked when initially fiddling around with this idea. The problem I’m having is that this code only works if the site returns a 200 OK code. Anything else causes an exception, including if I disable the internet. This also causes exceptions on sites that redirect e.g. www.google.com causes an exception during debugging I presume causes it’s redirecting to www.google.co.uk for me, however if I continue past the exception then it returns a 301 FOUND code with no problems.
The final result I’m looking for it for it to give me a return based on whether the site is online or having error (e.g. HTML RETURN CODE) additionally giving feedback when the site doesn’t exist (e.g. a non-registered URL) or just can’t be contacted.
The other peices of advice I’m looking for are into how to get some more information back from the request. Specifically at the moment I’m looking to also get the IP of the site that was checked.
It would also be nice to have it work without needing to have http:// before any URL, so for example www.google.com will work which at the moment it doesn’t because of unknown protocol.
Basically it would be great if someone had a link to some nice documentation for IndyHTTP because it seems to be sparse,
How I can avoid any interrupt in my application that Get a webpage HTML with idHTTP? because my application must gets some data in cycle of time automatically and save it for using with another application, and when this application stopped with an error and waiting for user to press OK button in error message box, it make a big problem for me…
I want to dismiss any error and retry idHTTP.get()
when those errors occurred.
most of errors that occurs in my application is ‘connection closed gracefully’ and sometimes ‘Host unreachable’.
Regards
|
|
|
Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.
Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.
Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка — 60 дней. Последующие попытки бан.
Мат в разделе — бан на три месяца…
Полезные ссылки: MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Выразить свое отношение к модераторам раздела можно здесь: Krid,
Rouse_
Обработка исключения при работе с idHTTP
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Добрый день. Подскажите пожалуйста, вот у меня есть кусочек кода: try GET.Get(‘http://<ресурс>.ru/forum/index.php?action=login2&user=’+login+’&passwrd=’+password); except on E : Exception do begin if pos(‘302 Found’, E.Message) <> 0 then Synchronize(Progress) else …; // вот здесь — что? end;
При запросе Get в ответе от сервера может прийти либо код 200 (ошибка на экране не показывается, значит пропускаем), либо вызваться одно из следущих исключений: Так вот вопрос: каким образом при исключении выполнить блок «try» с самого начала? Goto не работает в этом блоке. Сообщение отредактировано: Navern — 25.04.09, 11:24 |
Navern |
|
Мм, P.O.D., к чему мне сетевое программирование? Смысл-то не в том, что идёт обработка запросов, а в том, что мне надо вызвать блок «try» заново. Он сам по себе никакого отношения к сетевому программированию не имеет. |
medved_68 |
|
Цитата Navern @ 25.04.09, 11:24 Так вот вопрос: каким образом при исключении выполнить блок «try» с самого начала?
А если заключить обработку запроса в блок while??? |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Сетевое программирование
- Следующая тема
[ Script execution time: 0,0518 ] [ 16 queries used ] [ Generated: 5.06.23, 06:16 GMT ]
_peccator_ 0 / 0 / 1 Регистрация: 08.04.2012 Сообщений: 18 |
||||
1 |
||||
11.07.2012, 23:13. Показов 2202. Ответов 7 Метки нет (Все метки)
Есть код, который сохраняет веб страниц через idhttp. Но если на момент попытки сохранения страница недоступна, то возникает ошибка что-то типа Socket Error. Как сделать, чтоб прога при неудачной попытке сохранении не выдавала окно с ошибкой, а делала попытки сохранения до удачного результата? Добавлено через 30 минут
0 |
0 / 0 / 0 Регистрация: 11.07.2012 Сообщений: 4 |
|
12.07.2012, 02:09 |
2 |
попробуй занести эту всю лабуду в Try except end;. Вроде так. Должно работать…
0 |
0 / 0 / 1 Регистрация: 08.04.2012 Сообщений: 18 |
|
12.07.2012, 09:07 [ТС] |
3 |
Я заключил в Try except end;. Ошибку не выдает. Результат работы выводится на другую форму (она вместо showmessage), где отображается количество попыток. Так вот когда нет доступа до страницы, прога тупо виснет.
0 |
flatgad geJI<|>eP 188 / 187 / 19 Регистрация: 22.07.2010 Сообщений: 735 |
||||
12.07.2012, 15:27 |
4 |
|||
Программа не зависает а уходит в бесконечный цикл. Попробуй в коде после объявления лабела для goto вставить
оно разморозит твою программу. Я бы посоветовал сделать счетчик если к примеру 5-ть раз не удалось подключится к страничке выдавать сообщение типа повторить попытку соединения. Иначе будет лажа. Если интернет пропадет
0 |
_peccator_ 0 / 0 / 1 Регистрация: 08.04.2012 Сообщений: 18 |
||||
13.07.2012, 01:40 [ТС] |
5 |
|||
Всем спасибо.
Не помогло.
0 |
flatgad geJI<|>eP 188 / 187 / 19 Регистрация: 22.07.2010 Сообщений: 735 |
||||||||
13.07.2012, 11:37 |
6 |
|||||||
Всем спасибо.
Не помогло. покажи код где ты вставлял
. Не может быть что бы оно не помогло.
0 |
_peccator_ 0 / 0 / 1 Регистрация: 08.04.2012 Сообщений: 18 |
||||
21.07.2012, 08:09 [ТС] |
7 |
|||
0 |
Alex_pac 1301 / 707 / 107 Регистрация: 25.05.2011 Сообщений: 2,158 Записей в блоге: 51 |
||||
21.07.2012, 10:03 |
8 |
|||
1 |