Подтвердить что ты не робот

Как выполняется обработка ошибок в Retrofit 2? Я не могу найти класс RetrofitError, который предлагает большинство решений?

Я хочу реализовать механизм обработки ошибок с помощью Retorfit 2.

Доступные решения включают класс RetrofitError, который я не могу найти в текущем репо.

4b9b3361

Ответ 1

Если вы делаете синхронный запрос, вы определяете свой метод запроса в интерфейсе как Call<List<Car>>.

После выполнения запроса вы получите ответ и десериализованные данные, завернутые в Response<T>, как Response<List<Car>>. Это завернутое дает вам доступ к заголовкам, http-кодам и сырому телу ответа.

Вы можете получить доступ к корпусу ошибки как:

 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()
     } 

Для асинхронных вызовов вы получаете Throwable, если во время сетевого вызова выбрано исключение ввода/вывода:

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 
    }
});

Ответ 2

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

        }
});

Ответ 3

Простой метод:

int code = response.raw().code();
String message = response.raw().message();