改造错误处理

use*_*009 4 java error-handling android retrofit

我将我的Retrofit代码包装在如下所示的类中.如果从我发布的代码中不清楚它与OAuth的一个宁静服务进行交互.

什么是做错误处理的好方法?REST服务器以json格式返回错误消息.我想通过从我的班级中抛出一些例外来对该信息采取行动.我正在尝试做类似下面的事情.但这是一个好的设计吗?混合回调和异常是一个好主意吗?有没有更好的办法?

通过下面的方法,我可以从我的自定义异常中获取i18l消息,并将它们提供给用户.

public class RestClient implements IRestClient {
    private IRestAPI api;

    /**
     *
     * @param accessToken
     */
    public RestClient(final String accessToken)
    {
        RequestInterceptor requestInterceptor = new RequestInterceptor()
        {
            @Override
            public void intercept(RequestFacade request) {
                request.addHeader("Authorization", "Bearer " + accessToken);
            }
        };

        RestAdapter restAdapter = new RestAdapter.Builder()
                .setEndpoint(Config.ENDPOINT)
                .setRequestInterceptor(requestInterceptor)
                .build();
        api = restAdapter.create(IRestAPI.class);
    }

    @Override
    public void requestSomething(final Callback callback) {
        api.getSomething(new Callback<Something>() {
            @Override
            public void success(Something something, Response response) {
                callback.success(something, response);
            }

            @Override
            public void failure(RetrofitError error) {
                if(error.getMessage().getId().euqals(ACCESS_TOKEN_EXPIRED))
                {
                    throw new AccessTokenExpired();
                }
                else if(error.getMessage().getId().euqals(USER_NOT_FOUND))
                {
                    throw new UsernamePasswordNotFound();
                }
                else // something else happened...
                {
                    throw error;
                }
            }
        });
    }

    @Override
    public void deleteSomething(final Callback callback) {
        api.deleteSomething(new Callback<Something>() {
            @Override
            public void success(Something something, Response response) {
                callback.success(something, response);
            }

            @Override
            public void failure(RetrofitError error) {
                if(error.getMessage().getId().euqals(SOMETHING_NOT_FOUND))
                {
                    ...
                    ...
                    Different exceptions
                }
                ...
            }
        });
    }

}
Run Code Online (Sandbox Code Playgroud)

当然,我只需要一个成功的方法来创建我自己的回调接口.

ner*_*ler 8

当你建立了RestAdapter,你可以提供一个错误处理程序映射出你的自定义异常,它绕过调用failureCallback<T>任何东西的4xx/5xx系列.作为一个真正做作的例子:

public class Scratch {
    public static void main(String[] args) {
        Endpoints e = new RestAdapter.Builder()
                .setEndpoint("http://google.com")
                .setLogLevel(RestAdapter.LogLevel.FULL)
                .setErrorHandler(new ErrorHandler() {
                    @Override
                    public Throwable handleError(RetrofitError cause) {
                        switch (cause.getResponse().getStatus()) {
                            case 400:
                                /* Handle the expected body format */
                                cause.getBody();
                                throw new RuntimeException("Bad Request");
                            default:
                                /* Things and stuff */
                                throw new RuntimeException("");
                        }
                    }
                })
                .build()
                .create(Endpoints.class);

        e.getGoogle(new Callback<Response>() {
            @Override
            public void success(Response response, Response response2) {
                System.out.println("Got it");
            }

            @Override
            public void failure(RetrofitError error) {
                System.err.println("This won't ever be seen due to the error handler.");
            }
        });
    }

    private static interface Endpoints {
        @GET("/foo/bar")
        void getGoogle(Callback<Response> callback);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:然而,通过这样做,你可能会牺牲一个很大的原因,你为什么要使用Callback界面开始.如果这是您需要的常用用法,则使用同步调用并返回对象类型可能更有意义.我不完全知道你的用处,说这是必要的,但似乎它可能更合适.

  • @MikeWallaceDev这真的取决于你在做什么.如果你返回一个`Observable <T>`,那么这个逻辑是在你的`Subscriber`的`onError`方法中完成的,如果你正在做回调我不确定(我没有真正使用过那些,我使用Rx相反),如果您正在执行标准的"响应"或具体类,那么您将包装HTTP调用(如果适用).例如`try {myImplSyncronous.getResource(); } catch(RetrofitError e){/*handle*/}` (2认同)