rxjava中的异常处理

rxjava中的异常处理,java,lambda,exception-handling,rx-java,reactive-programming,Java,Lambda,Exception Handling,Rx Java,Reactive Programming,我试着习惯于rxjava,我试着以可观察的方式调用下面的QuoteReader。我不知道如何处理抛出的异常 public class QuoteReader { public Map<String, Object> getQuote() throws IOException{ OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder().

我试着习惯于
rxjava
,我试着以可观察的方式调用下面的
QuoteReader
。我不知道如何处理抛出的异常

public class QuoteReader {
   public Map<String, Object> getQuote() throws IOException{
       OkHttpClient okHttpClient = new OkHttpClient();
       Request request = new Request.Builder().url("http://quotes.rest/qod.json").build();
       Gson gson = new Gson();
       Map<String, Object> responseMap = null;

       try(Response response = okHttpClient.newCall(request).execute()) {
         responseMap = gson.fromJson(response.body().string(), Map.class);
         System.out.println("response map : "+responseMap);
       } catch(IOException ioe) {
         ioe.printStackTrace();
         throw ioe;
       } finally {
         okHttpClient = null;
         request = null;
       }
    return responseMap;
  }
}

我应该如何更新代码以处理异常。谢谢

对于可观察的
有另一种工厂方法,称为。这将为您提供一个
观察者
,作为lambda表达式的输入
Observer
是一种回调对象,有三种方法:
onNext(T)
onError(Throwable e)
onCompleted
。我听说你是RxJava新手,所以这里有一点额外的旁注:Rx合同规定一个
Observer
可以接收零个或多个
onNext
调用,然后是可能一个
onError
onCompleted
调用。在正则表达式中,这看起来像:
onNext*(onError | onCompleted)?

既然您知道了这一点,就可以使用
Observable.create

Observable.create(observer -> {
  try {
    observer.onNext(new QuoteReader.getQuote());
    observer.onCompleted();
  }
  catch (Throwable e) {
    observer.onError(e);
  }
}

请注意,在您订阅此
Observable
之前,此代码不会执行任何操作,就像您在问题中所做的那样

可观察管道不允许抛出异常。您必须使用runtimeExceptions。因此,更改代码应该是这样的

     try(Response response = okHttpClient.newCall(request).execute()) {
        responseMap = gson.fromJson(response.body().string(), Map.class);
        System.out.println("response map : "+responseMap);
   } catch(IOException ioe) {
     ioe.printStackTrace();
     new RuntimeException(ioe);

您可以在这里看到一个实际示例

使用可调用的
fromCallable
,该示例允许您的方法抛出(另外,它会缓慢地进行评估,甚至在您进入可观察世界之前都不会进行评估):


您应该将代码包装在try/catch块中,或者声明您的方法引发异常
     try(Response response = okHttpClient.newCall(request).execute()) {
        responseMap = gson.fromJson(response.body().string(), Map.class);
        System.out.println("response map : "+responseMap);
   } catch(IOException ioe) {
     ioe.printStackTrace();
     new RuntimeException(ioe);
rx.Observable.fromCallable(() -> new QuoteReader().getQuote())
          .subscribe(System.out::println, Throwable::printStackTrace);