web-dev-qa-db-fra.com

Comment se fait le traitement des erreurs dans Retrofit 2? Je ne trouve pas la classe RetrofitError que la plupart des solutions suggèrent?

Je souhaite implémenter un mécanisme de gestion des erreurs à l'aide de Retrofit 2.

Les solutions disponibles utilisent la classe RetrofitError que je ne trouve pas dans le dépôt actuel.

17
Khalil

Si vous effectuez une demande synchrone, vous définissez votre méthode de demande dans l'interface comme Call<List<Car>>.

Une fois que vous avez exécuté la demande, vous recevez une réponse et des données désérialisées enveloppées dans Response<T> comme Response<List<Car>>. Cet encapsulé vous donne accès aux en-têtes, aux codes http et au corps de réponse brut.

Vous pouvez accéder au corps d'erreur comme:

 Call<List<Car>> carsCall = carInterface.loadCars();

   try {
      Response<List<Car>> carsResponse = carsCall.execute();
        } catch (IOException e) {
           e.printStackTrace();
           //network Exception is throw here
        }
     if(carsResponse != null && !carsResponse.isSuccess() && carsReponse.errorBody() != null){
          // handle carsResponse.errorBody()
     } 

Pour les appels asynchrones, vous recevez Throwable, si une exception d'E/S est levée pendant l'appel réseau:

Call<List<Car>> call = service.loadCars();
call.enqueue(new Callback<List<Car>>() {
    @Override
    public void onResponse(Response<List<Car>> response) {
        // Get result from response.body(), headers, status codes, etc
    }

    @Override
    public void onFailure(Throwable t) {
      //handle error 
    }
});
14
Nikola Despotoski
Call<List<data>> call = MyService.loadData();
call.enqueue(new Callback<List<data>>() {
    @Override
    public void onResponse(Call<List<data>> call, Response<List<data>> response) {
        if (response.isSuccessful()) {
            //Response success. Handle data here
        }
        else{
            //For getting error message
            Log.d("Error message",response.message());
            //For getting error code. Code is integer value like 200,404 etc
            Log.d("Error code",String.valueOf(response.code()));
        }
    }

    @Override
    public void onFailure(Call<List<data>> call, Throwable t) {
        if (t instanceof IOException){
            //Add your code for displaying no network connection error

        }
});
8
Rohit P Soman