2015-11-05 50 views
5

我正在使用RetrofitRxJava用於網絡調用,RxBinding用於查看操作。在註冊屏幕上,點擊「註冊」按鈕後,我使用MyApi服務將信息發佈到本地服務器。如何處理RxJava中的`IllegalArgumentException`?

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

有什麼異常的堆棧跟蹤。這可能發生在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);