Pertanyaan doOnError tidak menangkap pengecualian


Saya baru saja mulai dengan RxJava, tetapi mungkin ada sesuatu yang belum diklik.

1

Integer[] items = {1, 2, 3, 0, 0, 4, 5, 6, 1};
Observable.from(items)
        .map(this::invert)
        .subscribe(i -> Log.d(LOG_TAG, "Inverted: " + i), t -> Log.d(LOG_TAG, "Error: " + t.getMessage()));

2

Integer[] items = {1, 2, 3, 0, 0, 4, 5, 6, 1};
Observable.from(items)
        .map(this::invert)
        .doOnError(t -> Log.d(LOG_TAG, "Error: " + t.getMessage()))
        .doOnNext(i -> Log.d(LOG_TAG, "Inverted: " + i))
        .subscribe();

Itu invert fungsi:

int invert(int i) {
    return 1 / i;
}

Yang pertama mengeksekusi secara normal, dan ketika pengecualian dilempar onError dieksekusi. Tetapi di sisi lain, yang kedua tidak berfungsi, jadi pengecualian dibuang sepenuhnya ke metode panggilan.

Apa perbedaan antara dua blok kode?


5
2018-01-06 15:04


asal


Jawaban:


Ingat itu .doOnError() menangkap pengecualian, melakukan sesuatu dengannya lalu membuangnya kembali. Jika Anda menginginkan perilaku yang berbeda, gunakan salah satu dari .onError* metode.

Sekarang, alasan mengapa pengecualian tidak menyebar ke pemanggil di # 1 tetapi di # 2 adalah bahwa Anda telah menyediakan pengendali kesalahan di # 1, tetapi tidak dalam # 2, dalam hal ini defaultnya adalah menyebarkan pengecualian .


7
2018-01-06 15:22