web-dev-qa-db-ja.com

RestSharpで例外をキャッチする方法

RestSharpでプロジェクトに取り組んでいます。時間の経過とともに、RestResponseクラスがスローする可能性のあるいくつかの例外を発見しました。そのほとんどは、アプリがクラッシュしないように処理する必要があります。すべての可能な例外を知って、それらを個別に処理するにはどうすればよいですか?.

12
okeziestanley

RestResponsesとエラー

これは、 RestSharpのwiki にあるドキュメントからのものです。

エラー処理に関する注意

**ネットワークトランスポートエラーがある場合(ネットワークがダウンしている、DNSルックアップが失敗しているなど)、RestResponse.StatusはResponseStatus.Errorに設定されます。**それ以外の場合はResponseStatus.Completedになります。 APIが404を返した場合でも、ResponseStatusは完了します。返されたHTTPステータスコードにアクセスする必要がある場合は、RestResponse.StatusCodeにあります。 Statusプロパティは、APIエラー処理とは関係なく完了のインジケーターです。

RestResponseのステータスを確認するための推奨される方法は、RestResponse.Status

内部のExecute呼び出しのソース自体は次のようになります。

private IRestResponse Execute(IRestRequest request, string httpMethod,Func<IHttp, string, HttpResponse> getResponse)
{
    AuthenticateIfNeeded(this, request);
    IRestResponse response = new RestResponse();
    try
    {
        var http = HttpFactory.Create();

        ConfigureHttp(request, http);

        response = ConvertToRestResponse(request, getResponse(http, httpMethod));
        response.Request = request;
        response.Request.IncreaseNumAttempts();

    }
    catch (Exception ex)
    {
        response.ResponseStatus = ResponseStatus.Error;
        response.ErrorMessage = ex.Message;
        response.ErrorException = ex;
    }

    return response;
}

これで、標準の.net例外を予期できることがわかります。 推奨される使用法 は、コード例のようにErrorExceptionの存在を確認することだけを提案しています。

//Snippet of code example in above link
var response = client.Execute<T>(request);

if (response.ErrorException != null)
{
    const string message = "Error retrieving response.  Check inner details for more info.";
    var twilioException = new ApplicationException(message, response.ErrorException);
    throw twilioException;
}

特定の種類の例外に対して特定のアクションを実行したい場合は、次のような行を使用して型比較を実行してください。

if (response.ErrorException.GetType() == typeof(NullReferenceException))
{
  //handle error
}

すべての可能な例外を知って、それらを個別に処理するにはどうすればよいですか?.

正直なところ、例外を個別にallキャッチしないことをお勧めします。その特定の要件には疑問があります。彼らがあなたに 例外を捕まえて優雅に/ を処理させて欲しくないのですか?

考えられる各ケースを個別に処理する必要がある場合は、テストで発生する例外をログに記録し、それらをチェックします。すべてを試してみると、100を超える例外が発生する可能性があります。それがベースの Exception class の目的です。

例外クラスは、Exceptionから継承するすべてのものを処理するための包括的なものです。一般的な考え方は、インターネットが利用できない、またはリモートサーバーがダウンしていることをユーザーに通知し、例外クラスに他のEdgeケースを処理させるなど、実際に何かできる例外を特別にメモすることです。 msdnリンク

27
Terrance