如何处理 RxJava 中的 `IllegalArgumentException`?

How to handle the `IllegalArgumentException` in RxJava?

我使用 RetrofitRxJava 进行网络调用,RxBinding 进行视图操作。在注册屏幕中,单击 'Register' 按钮后,我使用 MyApi 服务将信息发布到本地服务器。

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

如何make/force registerUser()#ErrorHandler() 处理网络调用期间发生的异常?

糟糕,网络调用并没有因 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);