2015-11-05 3 views
5

Я использую Retrofit с RxJava для сетевых вызовов и RxBinding для просмотра операций. На экране регистрации при нажатии кнопки «Регистрация» я отправляю информацию на локальный сервер, используя службу MyApi.Как обрабатывать `IllegalArgumentException` в RxJava?

SignupActivity.class

mCompositeSubscription.add(RxView.clicks(mRegisterButton).debounce(300, TimeUnit.MILLISECONDS). 
      subscribe(view -> { 
       registerUser(); 
      }, e -> { 
       Timber.e(e, "RxView "); 
       onRegistrationFailed(e.getMessage()); 
      })); 

private void registerUser() { 
mCompositeSubscription.add(api.registerUser(mEmail, 
     mPassword, mConfirmPassword) 
     .subscribe(user -> { 
      Timber.d("Received user object. Id: " + user.getUserId()); 
     }, e -> { 
      Timber.e(e, "registerUser() "); 
      onRegistrationFailed(e.getMessage()); 
     })); 
    } 

MyApi.class

public Observable<User> registerUser(String username, String password, String confirmPassword) { 
    return mService.registerUser(username, password, confirmPassword) 
     .compose(applySchedulers()); 
    } 

    @SuppressWarnings("unchecked") <T> Observable.Transformer<T, T> applySchedulers() { 
    return observable -> observable.subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()); 
    } 

MyService.class

@FormUrlEncoded @POST("users/") 
    Observable<User> registerUser(@Path("email") String username, 
     @Path("password") String password, @Path("password_confirmation") String confirmPassword); 

Вызов с IllegalArgumentException, поскольку я отправляю неверную информацию.

Что моя главная проблема, на IllegalArgumentException я думал RxJava будет выполнять registerUser()#ErrorHandler(), так как мой registerUser вызов службы не удалось, за исключением, но вместо этого он вызывает RxView#ErrorHandler().

Как я могу заставить/заставлять registerUser()#ErrorHandler() заботиться об исключении, возникшем во время сетевого вызова?

+2

Что такое StackTrace за исключением. Возможно, это происходит до того, как RxJava будет задействован. – akarnokd

+0

Какой тип "e"? Может быть, это недостаточно для того, чтобы поймать все исключения? – Yoshkebab

ответ

2

Мой плохой, сетевой вызов не сбой с IllegalArgumentException, но сама конструкция запроса не удалась с IllegalArgumentException.

java.lang.IllegalArgumentException: URL "users/" does not contain {email}". 

Вместо использования @Field аннотации для построения тела POST, я ошибочно использовал @Path аннотацию.

Правильное определение:

@FormUrlEncoded @POST("users/") 
Observable<User> registerUser(@Field("email") String username, 
     @Field("password") String password, @Field("password_confirmation") String confirmPassword); 
Смежные вопросы