当前位置: 首页 > 知识库问答 >
问题:

Mono-所有doOnError处理程序都被调用

陆卓
2023-03-14

我有这个单声道代码:

return Mono.just(operation)
        .map(this::validate)
        .then(execute(operation))
        .doOnError(ValidationException.class, this::handleValidationException)
        .doOnError(Exception.class, this::handleException);

当validate方法抛出ValidationException时,将同时调用handleValidation异常和handleException。我只希望调用handleValidationException。为什么会发生这种情况?如何防止handleException被调用?

共有1个答案

拓拔霄
2023-03-14

当验证方法抛出ValidationException时,handleValidationException和handleException都被调用。我只期望调用handleValidationException。为什么会发生这种情况?

…因为<code>ValidationException</code>也是通过继承的<code>Exception的实例,并且<code>doOnError()</code>不会“吞下”异常(因此它仍然会传播到下一个<code>doOnError()调用。

有几种不同的方法可以处理它——我的首选方法通常是使用< code>onErrorResume()来接收异常,并在处理完异常后返回一个空的publisher:

//...
.then(execute(operation))
.onErrorResume(ValidationException.class, e -> {
    this.handleValidationException();
    return Mono.empty();
})
.doOnError(Exception.class, ...)

…这将确保错误永远不会“失败”,如果这是你想要的行为的话。

我还想到了另外两种方法,但是,我不太喜欢它们。您可以在第二个doOnError()中使用谓词显式检查它是否不是ValidationException

.doOnError(e -> !(e instanceof ValidationException), ...)

...或者您也可以在一个块中处理所有异常,只需检查其中的类型:

.doOnError(e -> {
    if(e instanceof ValidationException) {

    }
    else {

    }
})
 类似资料:
  • 问题内容: 我正在学习React,并按照本教程创建了一个简单的Tic- Tac-Toe游戏,您可以在CodePen中查看。 对于在Board组件的函数内部返回的Square组件的属性中的箭头功能如何工作,我感到困惑。同样,我拥有的游戏组件也同样如此。我以为我可以不用箭头功能(就像一样)来编写它,但这会中断游戏。 问题答案: 期望功能。箭头函数没有自己的功能; 使用封闭执行上下文的值。箭头功能可替代

  • 我正在使用Netty 4.1.0.final,但我面临一个问题,即消息不能通过出站处理程序传递。我发布了一个示例程序,其中有一个入站和一个出站处理程序。入站处理程序在ChannelHandlerContext中使用writeAndFlush,我的理解是它应该将消息转发到管道中可用的第一个出站处理程序。为了简单起见,忽略了内存管理。 引导代码 入站处理程序代码 } 出站处理程序代码 } 输出 信息T

  • 我正在为Spring MVC中的异常处理开发示例演示应用程序。我正在尝试使用@ControllerAdvice处理异常 我遵循了本链接中描述的步骤。 但是当我运行我的应用程序时,我得到了以下错误 以下是我正在学习的课程 应用程序异常。JAVA 控制器类 ApplicationExceptionController。JAVA 下面是GlobalExceptionHandler类 GlobalExce

  • 问题内容: 我的主活动调用了我的子活动中的处理程序。该处理程序由某些Runnable 的子类使用,但我无法对其进行管理。现在,在这种情况下,我需要先删除它们,然后再完成“活动”(以某种方式调用,但仍然会反复调用)。无论如何,要从处理程序中删除所有回调吗? 问题答案: 以我的经验,这非常有效! 在removeCallbacksAndMessages的文档中,它说… 删除obj为令牌的回调和已发送消息

  • 我想知道向从ExchangeFilterFunction返回的单声道添加功能是否会应用于返回的最终单声道。基本上,我希望通过将一些关注点移出客户机类并添加到ExchangeFilterFunctions中来清理一些客户机代码,我可以将这些关注点添加到客户机中,但我的情况与单个调用有点不同。

  • 我正在运行vertx的本地实例。路由器将我的请求重定向到具有以下处理程序的工作顶点: processRequest函数接受请求主体,调用两个外部服务,聚合响应,然后返回给客户端。 当我点击上面的API时,我的请求超时。为执行我的请求而分配的工作线程池中的线程将永远在Tag1被阻止。进一步调试后,我发现Tag2中调用的应答处理程序没有被调用。 ServiceVerticle(ServiceVerti