2016-04-29 40 views
1

以下のコードをAndroid Appとして実行しました。 lHttpは、私が作ったWebServiceに要求を送ります。ここでIP(URL)とPortはユーザーによって定義されています。ただし、WebサービスがそのURLでアクティブでない場合、Appはクラッシュします。デバッグ中に、例外をキャッチしようとすると次のエラーが表示されます。IdHTTP例外の原因セグメンテーションフォールト

例外クラスEIdHTTPProtocolExceptionが発生し、 'HTTP/1.1 500内部サーバーエラー'というメッセージが表示されます。
発生例外クラスセグメンテーションフォルト(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

5人の例外ハンドラのうち、実際に例外をキャッチしているのはどれですか?サーバー側のMyWebService.dllにエラーがあり、HTTP応答によってクライアントアプリケーションにエラーメッセージが転送される可能性があります。 – mjn

+0

'HTTP/1.1 500内部サーバーエラー 'は、サーバーに間違った要求を送信していることを意味します。それは単にサーバー側の問題です。 – 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

あなたには2つの問題があるようです。 500エラーはサーバー側であり、クライアント側とは関係がありません。デルファイコードの問題は、アクセス違反を処理していないことです。例外の詳細を取得するには、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'の最初のパラメータはオプションではありません。あなたは '試着 'を見逃しています。私は言い方を変えれば、あなたは暗闇の中でスタブを作って、コンパイルすることはできないだろう。また、アクセス違反はどこで発生し、どの変更によって修正されますか?最後に、 'Free'の代わりに' Destroy'を呼ぶことはお勧めしません。間違った場所で呼び出すことはお勧めしません。 –

+0

'lHttp.Post()'が失敗した場合、 'lHttp.Destroy()'はスキップされます。それはそれ自身の 'try/finally'にあるべきです。 –

0

EIdHTTPProtocolExceptionは、サーバーがエラー応答を送信したことを意味します。それはPost()によって引き起こされる唯一の例外でなければなりません。あなたのexceptブロックはそれを処理しようとしていますが、先ほどのケースがEIdExceptionだったので実際には見えません。すべてのIndy例外は、EIdExceptionに由来し、exceptブロックは、最初に見つかった互換性のあるケースで一致します。あなたのEIdException場合はexceptブロックの底部付近にあるべきではなく、トップ:

すべての例外が Exceptionから派生し、あなたが特定の例外タイプごとに異なる何もしていないとして、次のように簡略化することができ
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; 

:言われていること

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

、アプリをデバッグするとセグメンテーション違反が実際に発生している場所を把握するために、コールスタックを見ているだろう。表示されたコードの外に出現する可能性があります。 Segfault(11)はアクセス違反に相当します。 EAccessViolationは、どこかにnilポインタがアクセスされているために発生します。

関連する問題