2016-04-29 17 views
1

Я запустил код ниже в качестве приложения для Android. LHttp отправляет запрос на WebService, который я создал, где IP (URL) и Порт определяются пользователем. Однако, если веб-служба не активна в этом URL-адресе, приложение разбилось. Во время отладки он дает мне следующие ошибки, пытаясь поймать исключение.Исключение IdHTTP вызывает ошибку сегментации

класс исключенных исключений EIdHTTPProtocolException с сообщением 'HTTP/1.1 500 Internal Server Error'.
класс исключения исключений Сегментация неисправности (11).
класс исключений класса EAccessViolation с сообщением «Нарушение прав доступа по адресу B6FBD7CE, доступ к адресу 000000A8».

Кто-нибудь знает, как поймать это исключение, не разбивая приложение?

Path:= 'http://'+ Conf.IP + ':' + Conf.Port +'/services/MyWebService.dll/GetQuestions'; 

    lHTTP:= TIdHTTP.Create(nil); 

    Stream:= TStringStream.Create; 
    Stream.WriteString(Requisition); 

    try 
    Result := lHTTP.Post(Path, Stream); 
    except 
    on E:EIdException do 
     Result:= E.Message; 

    on E:EIdSocketError do 
     Result:= E.Message; 

    on E:EIdConnClosedGracefully do 
     Result:= E.Message; 

    on E:EIdHTTPProtocolException do 
     Result:= E.Message; 

    on E:Exception do 
     Result:= E.Message; 
    end; 

    Stream.Free; 

    FreeAndNil(lHTTP); 
+0

Какое из пяти обработчиков исключений действительно выдает исключение? Возможно, на стороне сервера MyWebService.dll произошла ошибка, и ответ HTTP только переносит сообщение об ошибке в ваше клиентское приложение, – mjn

+0

'HTTP/1.1 500 Internal Server Error' означает, что вы отправляете неверный запрос на сервер или это просто проблема на стороне сервера. – Machado

ответ

0

Я не уверен, что вы на самом деле просят: решение 500 ISE или отлов исключения, но я буду с:

ли кто-нибудь знает, как поймать это исключение Whithout сбой приложения?

Вы можете создать глобальный обработчик исключений.

1- Объявите свой собственный обработчик исключений в разделе «общедоступные объявления» формы. Например, если форма называется «Form1:»

{ Public declarations } 
procedure MyExceptionHandler(Sender : TObject; E : Exception); 

2 - Определение обработчика исключений в разделе «реализации»:

procedure TForm1.MyExceptionHandler(Sender : TObject; E : Exception); 
begin 

    if E.Message.Contains('HTTP/1.1 500 Internal Server Error') then 
    begin 
    // Do Something 
    end; 

    { 
    // Default App Exception 
    Application.ShowException(E); 
    } 

     end; 

3 - И, наконец, назначить вновь созданный обработчик исключений для событие OnException вашего приложения.

procedure 
    TForm1.FormCreate(Sender: TObject); 
begin 
    { begin new code } 
    Application.OnException := 
    MyExceptionHandler; 
    { end new code } 
end; 
0

Кажется, у вас есть две проблемы. Ошибка 500 - это серверная сторона, и она не должна иметь ничего общего с клиентской стороной. Проблема с кодом delphi заключается в том, что он не обрабатывает нарушение доступа. Вы должны попытаться сделать исключение catch, чтобы получить более подробную информацию об исключении. У меня нет остальной части кода, поэтому трудно проверить. И какой запрос вы пытаетесь? получить, после ....

lHTTP := TIdHTTP.Create; //Try with out NIL 

    try 
    Result := lHTTP.Post(path, Stream); 
    lHTTP.Destroy; // Try destroying the TiDHTTP 
    finally 
    Stream.Free; 
    except on e:Exception do 
    ShowMessage (e.Message +' '+ Result); 
    end; 

увидеть каждое исключение добавить ShowMessage плюс результат на каждом исключении на свой код, чтобы получить больше информации об исключениях.

ShowMessage (result); //if result is a string 
+0

uhhm, какой синтаксис и параметры я составлял? Все это синтаксис и параметры delphi. Я пытаюсь помочь устранить нарушение доступа. – Deleted

+0

Первый параметр 'Create' не является необязательным. Вам не хватает «try». Другими словами, вы делаете удары в темноте, которые невозможно компилировать. Кроме того, где происходит нарушение прав доступа, и какие из ваших изменений фиксируют его? Наконец, пожалуйста, не рекомендуем вызывать 'Destroy' вместо' Free' и не рекомендуем вызывать его в неправильном месте. –

+0

Если 'lHttp.Post()' failed, 'lHttp.Destroy()' пропускается. Это должно быть по-своему 'try/finally'. –

0

EIdHTTPProtocolException означает, что сервер отправил сообщение об ошибке. Это должно быть единственным исключением, которое поднимается Post(). Ваш блок except пытается его обработать, но на самом деле не увидит его, так как у вас есть более ранний случай для EIdException. Все исключения Indy происходят от EIdException, а блок except соответствует первому найденному совпадающему случаю.Ваш EIdException случай должен быть в нижней части except блока, а не сверху:

try 
    Result := lHTTP.Post(Path, Stream); 
    except 
    on E:EIdHTTPProtocolException do 
     Result:= E.Message; 

    on E:EIdConnClosedGracefully do 
     Result:= E.Message; 

    on E:EIdSocketError do 
     Result:= E.Message; 

    on E:EIdException do 
     Result:= E.Message; 

    on E:Exception do 
     Result:= E.Message; 
    end; 

Что может быть упрощена до следующего, так как все исключения происходят из Exception, и вы что-то другое для конкретных типов исключений не делает :

try 
    Result := lHTTP.Post(Path, Stream); 
    except 
    on E:Exception do 
     Result:= E.Message; 
    end; 

Это, как говорится, вам придется отлаживать приложение и посмотреть на стек вызовов, чтобы выяснить, где на самом деле выдаёт ошибку сегментации происходит. Вероятно, это происходит за пределами кода, который вы указали. Segfault (11) эквивалентен нарушению доступа. Кажется, что EAccessViolation происходит из-за того, что куда-то куда-то обращается указатель на нуль.

Смежные вопросы