Vertx - 使用 Router failureHandler 处理异步调用中的错误

Ork*_*zen 1 vert.x

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

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

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

// 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");
        });
Run Code Online (Sandbox Code Playgroud)
  1. 这是预期的吗?
  2. 我们能否以某种方式try-catch在路由器中为异步上下文中发生的异常声明一个全局变量?

tse*_*ont 5

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

应该在以下情况下触发:

  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");

});
Run Code Online (Sandbox Code Playgroud)

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