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);