首页 > 解决方案 > Vertx - 使用 Router failureHandler 处理异步调用中的错误

问题描述

我们最近在 Vertx 路由器中发现了failureHandler

我们认为它可以帮助我们摆脱所有重复的try-catch障碍。但是,唉,似乎在回调中抛出的异常没有被failureHandler.

示例:在下面,failureHandler仅在第三种情况下调用:

// Get the user details
        router.get("/user").handler(ctx -> {

            ctx.response().headers().add("content-type", "application/json");

            // some async operation
            userApiImpl.getUser(ctx, httpClient, asyncResult -> {

//          ctx.response().setStatusCode(404).end();    //1 
//          throw new RuntimeException("sth happened"); //2 
                ctx.fail(404);  //3
            });
        });


        // ============================
        // ERROR HANDLER
        // ============================
        router.get("/user").failureHandler(ctx -> {

            LOG.info("Error handler is in the action.");
            ctx.response().setStatusCode(ctx.statusCode()).end("Error occurred in method");
        });
  1. 这是预期的吗?
  2. try-catch我们能否以某种方式在路由器中为异步上下文中发生的异常声明一个全局变量?

标签: vert.x

解决方案


预计手动发送带有错误代码的响应不会触发故障处理程序。

它应该在以下情况下触发:

  1. 路由路径匹配

  2. 处理程序抛出异常或调用 ctx.fail()

这是一个例子:

Route route1 = router.get("/somepath/path1/");

route1.handler(routingContext -> {

  // Let's say this throws a RuntimeException
  throw new RuntimeException("something happened!");

});

Route route2 = router.get("/somepath/path2");

route2.handler(routingContext -> {

  // This one deliberately fails the request passing in the status code
  // E.g. 403 - Forbidden
  routingContext.fail(403);

});

// Define a failure handler
// This will get called for any failures in the above handlers
Route route3 = router.get("/somepath/*");

route3.failureHandler(failureRoutingContext -> {

  int statusCode = failureRoutingContext.statusCode();

  // Status code will be 500 for the RuntimeException or 403 for the other failure
  HttpServerResponse response = failureRoutingContext.response();
  response.setStatusCode(statusCode).end("Sorry! Not today");

});

请参阅 Vert.x Web 文档的错误处理部分


推荐阅读