为什么 Mono.doOnError 打印错误日志

问题描述

我有将数据存储到 couchbase 数组的功能。我正在使用 couchbase 3.0 sdk 中的反应式集合。

使用下面的示例,我可以存储数据,但我在日志中打印了 CasMismatchException。但由于它是预期的,我不想打印它,我该如何实现?

private Consumer<? super Throwable> upsert(String key,String value) {
    return e -> {
      if (e instanceof CasMismatchException || e instanceof DocumentExistsException) {

            defaultCollection // couchbase reactive default colection
            .get(key)
            .subscribe(
                s -> {
                  List<String> values = new ArrayList<>();
                  values.addAll(s.contentAs(ArrayList.class));
                    values.add(value);
                    defaultCollection
                        .replace(key,values,ReplaceOptions.replaceOptions().cas(s.cas()))
                        .doOnError(upsert(key,value))
                        .subscribe();
                });
      } else {
        LOGGER.error("Error on couch operation on - {}",e);
      }
    };
  }

代码打印错误日志,我可以避免吗?

解决方法

我使用 Hooks.onErrorDropped 解决了重复打印错误。

warning: unable to build chain to self-signed root for signer "Apple Distribution: name. (teamID)"
/Users/name/Library/Developer/Xcode/DerivedData/app-fjkfkfdf/Build/Intermediates.noindex/ArchiveIntermediates/helloworld/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/Info.plist.appex: errSecInternalComponent'

但正如评论中所建议的,您也可以使用 onErrorResume。我将 onErrorDropped 用于我的特定情况。更详细的解释可以在下面的链接中找到。