Rxjava2異常捕獲

Observable.just("123")
        .map(new Function<String, Integer>() {
    @Override
    public Integer apply(String s) throws Exception {
        String i = null;
        i.length();
        return 1;
    }
}).subscribe();

這種情況下, 由于在subscribe時沒有傳入異常處理時的Consumer, 所以在這里會崩掉.
看一下源碼:

public final Disposable subscribe() {
    // 會傳入一個默認的 Functions.ERROR_CONSUMER
    return subscribe(Functions.emptyConsumer()
            , Functions.ERROR_CONSUMER
            , Functions.EMPTY_ACTION, Functions.emptyConsumer());
}

public static final Consumer<Throwable> ERROR_CONSUMER = new Consumer<Throwable>() {
    @Override
    public void accept(Throwable error) {
        // 捕獲到異常后會掉還用 RxJavaPlugins.onError.onError(); 
        RxJavaPlugins.onError(error);
    }
};

public static void onError(Throwable error) {
    // 注意errorHandler
    Consumer<Throwable> f = errorHandler;

    if (error == null) {
        error = new NullPointerException("onError called with null. Null values are generally not allowed in 2.x operators and sources.");
    }

    // errorHandler不為空, 調(diào)用它的 accept() 方法, 并 return
    if (f != null) {
        try {
            f.accept(error);
            return;
        } catch (Throwable e) {
            e.printStackTrace(); // NOPMD
            uncaught(e);
        }
    }
    
    // 如果執(zhí)行到這里就會拋出異常
    error.printStackTrace(); // NOPMD
    uncaught(error);
}
// RxjavaPlugins
static volatile Consumer<Throwable> errorHandler;

public static void setErrorHandler(Consumer<Throwable> handler) {
    if (lockdown) {
        throw new IllegalStateException("Plugins can't be changed anymore");
    }
    errorHandler = handler;
}

可以利用 上面的方法設(shè)置errorHandler, 這樣當你, subscribr()不傳入errorConsumer時, 就會捕獲到異常不會崩掉

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容