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

Vertx无法自动处理客户端的内部代码错误

华星文
2023-03-14

我有一个顶点,它接受REST请求,通过事件总线从其他顶点获取数据并响应客户端。

vertx.exceptionHandler(event -> logger.error("Vertx exception ", event));    

router.get("/api/v1/:param").handler(this::routerHandler);


public void routerHandler(RoutingContext rc) {
     vertx.eventBus().request("data", param,
                result -> {
                    if (result.succeeded()) {
                        logger.info("Request handled successfully");
                        // intentionally creating exception body() will return String
                        JsonObject jsonObject = (JsonObject) result.result().body();
                         rc.response().end(jsonObject)
                    }else{
                        logger.error("Request failed");
                 }
}

当引发异常时,它会打印在我在vertx实例中设置的异常处理程序中,但之后vertx不会立即向客户端报告异常,而是等待超时(30秒)发生。

我尝试将错误处理程序附加到路由器对象,将失败处理程序附加到路由对象,但没有任何帮助可以立即向客户端报告异常。我知道我可以尝试捕捉并在捕捉块中报告错误。但我想知道是否还有其他方法来处理这个问题,比如Servlet或Spring MVC报告返回给客户机,即使代码中没有处理异常。

router.errorHandler(500,routingContext -> {
            System.out.println(routingContext.failed());
           routingContext.response().end("Exception ");
        });

router.route().handler(BodyHandler.create()).failureHandler(routingContext -> {

共有1个答案

阎璞瑜
2023-03-14

未捕获的异常会报告给上下文exceptionHandler。默认情况下,它会将异常打印到控制台。

您可以对其进行配置,但无论如何都不会获得对相应HTTP请求的引用(例外情况可能来自不同的方面)。

大多数这样的问题通常在单元/集成/验收测试中发现。

对于剩余部分,您可以在路由器定义上设置一个超时处理程序,以确保请求在默认30秒前结束。

如果你不想错过任何未捕获的异常,你应该切换到Vert. x RxifiedAPI。使用RxJava时,抛出的任何异常都将报告给订阅者。

 类似资料:
  • 我注意到Rest客户端上有两个指南:MicroProfile和Vertx。既然微文件支持异步,那么使用基于Vertx的Rest客户端有什么好处?

  • 我在服务器上使用GraphQL和mongoose。 当发生验证错误时,GraphQL突变发送状态代码为200的响应。在客户端,响应如下所示: 我想使用阿波罗客户端突变promise的功能访问验证错误。类似: 如何做到这一点?

  • 我尝试使用EventHub Go客户端发送一个简单的“hello world”事件,但收到以下错误消息: *错误{条件:amqp:内部错误,描述:服务无法处理该请求;请重试该操作。有关异常类型和正确的异常处理的详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=761101TrackingId:be0c66437a1447b7accdc113c84955d

  • 在我的quarkus rest项目中,我有一个使用mutiny的restclient: 我想处理Property non 2XX httpError,所以我制作了我的例外文件 客户端上的错误调用显示MyExceptionMapper处理响应,但异常会引发,并且不会成为我的Uni客户端响应对象上的失败 我是否以错误的方式对rest客户使用叛变? 谢谢 更新 好吧,我忘了添加依赖quarkus res

  • 请给我一些关于任务解决方案的最佳模式的建议。我的任务是: 用户通过自己的rest控制器向Camunda处理器发出请求 后端端的BPMN架构由多个异步服务链组成 只有当BPMN上的一个最终服务做出响应时,数据才准备好响应给用户。 每条链条的工作时间不超过10-15秒。并且用户的会话计数每小时少于500个。 rest管制员的工作如何组织?在同一调用中强制控制器等待结果是否可以接受?瓶颈在哪?

  • 我有一个ASP.NET Core1.0Web API应用程序,并试图弄清楚如果我的控制器调用的函数出错,如何将异常消息传递给客户端。 我确实看到了一些使用的文档,但是为了使用它,我必须安装compat shim。在Core1.0中有没有一种新的方法来做这些事情? 这是我一直在尝试的垫片,但它不起作用: 当抛出时,我查看客户端,在内容中找不到我正在发送的消息。