如何在RxJava中的Observable中处理map()中的exception

我想做这个:

Observable.just(bitmap) .map(new Func1() { @Override public File call(Bitmap photoBitmap) { //File creation throws IOException, //I just want it to hit the onError() inside subscribe() File photoFile = new File(App.getAppContext().getCacheDir(), "userprofilepic_temp.jpg"); if(photoFile.isFile()) {//delete the file first if it exists otherwise the new file won't be created photoFile.delete(); } photoFile.createNewFile(); //saves the file in the cache dir FileOutputStream fos = new FileOutputStream(photoFile); photoBitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);//jpeg format fos.close(); return photoFile; } }) .subscribe(//continue implementation...); 

基本上在call()方法中,它可以抛出exception。 如何让Observer在onError()处理它。 或者这不是思考这个问题的正确方法吗?

  • 何时取消订阅订阅
  • 使用未收到的消息调试RxJava问题的最佳方法是什么
  • RxJava在多个用户之间共享可观测的排放
  • 在Retrofit + RxJava中链接请求
  • 处理改造2 RX中的错误
  • 用全局的rxjava处理networkingexception进行翻新
  • Proguard和RxAndroid V1.1.0
  • Android Rxjava订阅variables更改
  • rx将始终捕获错误,即使这是RuntimeException。 所以你可以在catch块中抛出某种运行时exception。 这实际上应该是如何工作的。

      Observable.just(bitmap) .map(b -> { try { // do some work which throws IOException throw new IOException("something went wrong"); } catch (IOException e) { throw new RXIOException(e); // Or you can use throw Exceptions.propagate(e); // This helper method will wrap your exception with runtime one } }).subscribe(o -> { // do something here }, exception -> exception.printStackTrace()); public static class RXIOException extends RuntimeException { public RXIOException(IOException throwable) { super(throwable); } } 

    使用1.0.15,有一个fromCallable工厂方法,让你为每个订阅者运行一个Callable实例,你也可以抛出已检查的exception:

     Observable.fromCallable(() -> { File photoFile = new File(App.getAppContext().getCacheDir(), "userprofilepic_temp.jpg"); if (photoFile.isFile()) { //delete the file if it exists otherwise the new file won't be created photoFile.delete(); } photoFile.createNewFile(); //saves the file in the cache dir FileOutputStream fos = new FileOutputStream(photoFile); photoBitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);//jpeg format fos.close(); return photoFile; }) .subscribe(...) 

    编辑:

     source.flatMap(v -> { try { //... return Observable.just(result); } catch (Exception e) { return Observable.error(e); } }) .subscribe(...); 

    刚刚创建了helper类来将这个样板提取到另一个地方:

     public class RxRethrow { public static  Func1 rethrow(Func1R catchedFunc) { return t -> { try { return catchedFunc.call(t); } catch (Exception e) { throw Exceptions.propagate(e); } }; } public interface Func1R extends Function { R call(T t) throws Exception; } } 

    你可以这样称呼它:

     .map(RxRethrow.rethrow(products -> mapper.writer(schema).writeValueAsString(products))) 

    我不知道在第一次提出并回答这个问题时情况如何,但RxJava目前包含一个辅助方法,用于此目的: Exceptions.propagate(Throwable t)

    RxJava Javadoc

    直接抛出RuntimeException和Error或将任何其他exceptiontypes包装到RuntimeException中的便捷方法。