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