Обработка ошибок idhttp

Для меня не очевидным был этот вопрос. Хотелось получить информацию об ошибке сервера на клиенте. То есть, примерно так…

71

Ведь 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;

Вот в принципе и всё!

70

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

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    !
    Соблюдайте общие правила форума

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
    Указывайте точные версии Delphi и используемых сетевых библиотек.

    Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.


    Внимание:
    попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…


    Полезные ссылки:
    user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


    Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

    >
    Обработка исключения при работе с idHTTP

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему

      


    Сообщ.
    #1

    ,
    25.04.09, 11:24

      Добрый день. Подскажите пожалуйста, вот у меня есть кусочек кода:

      ExpandedWrap disabled

          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 (ошибка на экране не показывается, значит пропускаем), либо вызваться одно из следущих исключений:
      — 302 — это значит, что сработал редирект. Это означает, что пару логин-пароль нужно поместить в листбокс.
      — 503 — сервис временно недоступен. Значит, нужно вернуться ещё раз к блоку «try».
      — -1 — неизвестно что. Тоже надо вернуться.
      — может вообще прийти пустой ответ. И тоже это означает, что необходимо вернуться.
      И так надо возвращаться назад до тех пор, пока в ответе от сервера не будут присутствовать либо 302 (и обработать), либо 200 (вообще пропустить).

      Так вот вопрос: каким образом при исключении выполнить блок «try» с самого начала? Goto не работает в этом блоке.

      Сообщение отредактировано: Navern — 25.04.09, 11:24


      Navern



      Сообщ.
      #2

      ,
      25.04.09, 11:45

        Мм, P.O.D., к чему мне сетевое программирование? Смысл-то не в том, что идёт обработка запросов, а в том, что мне надо вызвать блок «try» заново. Он сам по себе никакого отношения к сетевому программированию не имеет.


        medved_68



        Сообщ.
        #3

        ,
        25.04.09, 13:10

          Цитата Navern @ 25.04.09, 11:24

          Так вот вопрос: каким образом при исключении выполнить блок «try» с самого начала?

          А если заключить обработку запроса в блок while??? :D

          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

          0 пользователей:

          • Предыдущая тема
          • Delphi: Сетевое программирование
          • Следующая тема

          Рейтинг@Mail.ru

          [ 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 минут
          Собственно код

          Delphi
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          
          var
            ms: TmemoryStream;
          begin
            form2.label1.Caption:='идет сохранение...';
            form2.show;
            ms := TmemoryStream.create;
            idhtp1.Get(adres, ms);
            ms.SaveToFile(fname);
            form2.label1.Caption:='сохранено';
            form2.Timer1.Enabled:=true;
          end;



          0



          0 / 0 / 0

          Регистрация: 11.07.2012

          Сообщений: 4

          12.07.2012, 02:09

          2

          попробуй занести эту всю лабуду в Try except end;.
          После except делай переход к метке goto , которую ты расположишь пред своей лабудой =)

          Вроде так. Должно работать…



          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 вставить

          Delphi
          1
          
          Application.ProcessMessages;

          оно разморозит твою программу. Я бы посоветовал сделать счетчик если к примеру 5-ть раз не удалось подключится к страничке выдавать сообщение типа повторить попытку соединения. Иначе будет лажа. Если интернет пропадет



          0



          _peccator_

          0 / 0 / 1

          Регистрация: 08.04.2012

          Сообщений: 18

          13.07.2012, 01:40

           [ТС]

          5

          Всем спасибо.

          Delphi
          1
          
          Application.ProcessMessages;

          Не помогло.
          поставил счётчик с в котором на форме задаю интервал подключения к сайту. всё менее-более работает.



          0



          flatgad

          geJI<|>eP

          188 / 187 / 19

          Регистрация: 22.07.2010

          Сообщений: 735

          13.07.2012, 11:37

          6

          Цитата
          Сообщение от _peccator_
          Посмотреть сообщение

          Всем спасибо.

          Delphi
          1
          
          Application.ProcessMessages;

          Не помогло.
          поставил счётчик с в котором на форме задаю интервал подключения к сайту. всё менее-более работает.

          покажи код где ты вставлял

          Delphi
          1
          
          Application.ProcessMessages;

          . Не может быть что бы оно не помогло.



          0



          _peccator_

          0 / 0 / 1

          Регистрация: 08.04.2012

          Сообщений: 18

          21.07.2012, 08:09

           [ТС]

          7

          Delphi
          1
          2
          3
          4
          5
          6
          7
          8
          9
          
          form1.temp:='';
          while form1.temp='' do
            begin
              try
                form1.temp:=h.get(form1.adres);
              except end;
             Application.ProcessMessages;
              if form1.temp<>'' then form2.Label1.Caption:='Cохранено';
            end



          0



          Alex_pac

          1301 / 707 / 107

          Регистрация: 25.05.2011

          Сообщений: 2,158

          Записей в блоге: 51

          21.07.2012, 10:03

          8

          Delphi
          1
          2
          3
          4
          5
          6
          
          try
          form1.temp:=h.get(form1.adres);
          form2.Label1.Caption:='Сохранено';
          except
          form2.Label1.Caption:='Ошибка';
          end;



          1



          Понравилась статья? Поделить с друзьями:
        • Обработка ошибок socket
        • Обработка ошибок firebird delphi
        • Обработка ошибок ruby
        • Обработка ошибок camunda
        • Обработка ошибок react native