如何在Retrofit 2中完成错误处理?我找不到大多数解决方案提出的RetrofitError类?

Kha*_*lil 17 android retrofit

我想使用Retorfit 2实现错误处理机制.

可用的解决方案是使用RetrofitError类,我在当前的repo中找不到.

Nik*_*ski 14

如果要进行同步请求,请在接口中将请求方法定义为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()
     } 
Run Code Online (Sandbox Code Playgroud)

对于异步调用,Throwable如果在网络调用期间抛出I/O异常,则会收到:

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 
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 请注意,即使失败也会调用**`onResponse`,并且`response.body()`将(假设)为null!** (10认同)

Roh*_*man 8

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

        }
});
Run Code Online (Sandbox Code Playgroud)