2016-05-07 24 views
6

Rất tiếc, có khả năng đặt trình xử lý lỗi mặc định trong RxJava không?Trình xử lý lỗi mặc định RxJava

Ví dụ, tôi một số mã trong Utils.kt file:

fun BaseFragment.callGallery(view: View){ 
    view.clicks().bindToLifecycle(this).subscribe { 
     RxPaparazzo.takeImage(this) 
     .usingGallery() 
     .subscribe { response -> 
      throw RuntimeException("Where is this exception from?") 
     } 
    } 
} 

Nhưng trong stacktrace không có bất kỳ gợi ý về Utils.kt hoặc về bất kỳ tập tin của tôi.

Tôi hiểu rằng tôi có thể đặt trênError trong mọi người đăng ký. với mã như:

.subscribe ({ response -> 
    .... 
}, { it.printStackTrace() }) 

Nhưng tôi muốn đặt một lỗi mặc định cho tất cả người đăng ký. Tôi làm nó như thế nào?

stacktrace:

05-07 12:11:48.246 10966-10966/ru.egslava.rxfluxtest E/AndroidRuntime: FATAL EXCEPTION: main 
Process: ru.egslava.rxfluxtest, PID: 10966 
java.lang.RuntimeException: Unable to destroy activity {ru.egslava.rxfluxtest/rx_activity_result.HolderActivity}: rx.exceptions.OnErrorNotImplementedException: Where is this exception from? 
    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3831) 
    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3849) 
    at android.app.ActivityThread.-wrap5(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1398) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:148) 
    at android.app.ActivityThread.main(ActivityThread.java:5417) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    Caused by: rx.exceptions.OnErrorNotImplementedException: Where is this exception from? 
    at rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call(InternalObservableUtils.java:374) 
    at rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call(InternalObservableUtils.java:371) 
    at rx.internal.util.ActionSubscriber.onError(ActionSubscriber.java:44) 
    at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:157) 
    at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:120) 
    at rx.exceptions.Exceptions.throwOrReport(Exceptions.java:204) 
    at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:144) 
    at rx.internal.operators.OperatorOnErrorResumeNextViaFunction$4.onNext(OperatorOnErrorResumeNextViaFunction.java:153) 
    at rx.internal.operators.OperatorMap$MapSubscriber.onNext(OperatorMap.java:74) 
    at rx.internal.operators.OperatorMerge$MergeSubscriber.emitScalar(OperatorMerge.java:391) 
    at rx.internal.operators.OperatorMerge$MergeSubscriber.tryEmit(OperatorMerge.java:353) 
    at rx.internal.operators.OperatorMerge$InnerSubscriber.onNext(OperatorMerge.java:838) 
    at rx.observers.Subscribers$5.onNext(Subscribers.java:229) 
    at rx.internal.operators.OperatorZip$Zip.tick(OperatorZip.java:264) 
    at rx.internal.operators.OperatorZip$Zip$InnerSubscriber.onNext(OperatorZip.java:335) 
    at rx.internal.operators.OperatorMap$MapSubscriber.onNext(OperatorMap.java:74) 
    at rx.internal.util.ScalarSynchronousObservable$WeakSingleProducer.request(ScalarSynchronousObservable.java:268) 
    at rx.Subscriber.setProducer(Subscriber.java:211) 
    at rx.internal.operators.OperatorMap$MapSubscriber.setProducer(OperatorMap.java:99) 
    at rx.internal.util.ScalarSynchronousObservable$1.call(ScalarSynchronousObservable.java:79) 
    at rx.internal.util.ScalarSynchronousObservable$1.call(ScalarSynchronousObservable.java:75) 
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50) 
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) 
    at rx.Observable.unsafeSubscribe(Observable.java:8452) 
    at rx.internal.operators.OperatorZip$Zip.start(OperatorZip.java:214) 
    at rx.internal.operators.OperatorZip$ZipSubscriber.onNext(OperatorZip.java:156) 
    at rx.internal.operators.OperatorZip$ZipSubscriber.onNext(OperatorZip.java:122) 
    at rx.internal.util.ScalarSynchronousObservable$WeakSingleProducer.request(ScalarSynchronousObservable.java:268) 
    at rx.Subscriber.setProducer(Subscriber.java:209) 
    at rx.internal.util.ScalarSynchronousObservable$1.call(ScalarSynchronousObservable.java:79) 
    at rx.internal.util.ScalarSynchronousObservable$1.call(ScalarSynchronousObservable.java:75) 
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50) 
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) 
    at rx.Observable.unsafeSubscribe(Observable.java:8452) 
    at rx.internal.util.ScalarSynchronousObservable$4.call(ScalarSynchronousObservable.java:227) 
    at rx.internal.util.ScalarSynchronousObservable$4.call(ScalarSynchronousObservable.java:220) 
    at rx.Observable.unsafeSubscribe(Observable.java:8452) 
    at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:248) 

Trả lời

3

Bạn có thể sử dụng toán tử onErrorResumeNext. Ví dụ về cách sử dụng:

fun BaseFragment.callGallery(view: View){ 
    view 
     .clicks() 
     .bindToLifecycle(this) 
     .onErrorResumeNext { err -> log(err); Observable.empty() } 
     .subscribe { 
     // do stuff 
     } 
} 
7

RxJava có Plugins để hỗ trợ cắt ngang mối quan tâm độc đáo. Đặc biệt RxJavaErrorHandler được desiged để gắn hành vi xử lý lỗi toàn cầu như vậy:

RxJavaPlugins.getInstance().registerErrorHandler(object : RxJavaErrorHandler() { 
    override fun handleError(e: Throwable?) { 
     println("Global error handler: $e") 
    } 
}) 

Observable.just(1).concatMap({ Observable.error<Int>(Exception("Just throwing $it")) }) 
     .subscribe({ 
      println("I'll not be called") 
     }, { 
      println("Specific error handler: $it") 
     }) 

Đoạn mã trên sẽ in:

Error occurred java.lang.Exception: Just throwing 1 
A default error handler: java.lang.Exception: Just throwing 1 

Tôi nghi ngờ rằng bạn cũng muốn được quan tâm trong việc cải thiện thông tin chẩn đoán có sẵn trong stacktraces khi bạn có lỗi chưa được giải quyết. Cho rằng có một RxJavaStackTracer rằng khi được sử dụng RxJavaPlugins.getInstance().registerObservableExecutionHook(RxJavaStackTracer()) sẽ tăng cường thông tin theo dõi ngăn xếp. Các vấn đề Stacktraces and subscribeOn/observeOn trên github là một đọc tốt về chủ đề này.

+0

Có vẻ như nó không được dùng nữa –

Các vấn đề liên quan