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

时间:2018-08-06 08:42:20

标签: vert.x

我们最近在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吗?

1 个答案:

答案 0 :(得分:1)

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

在以下情况下应触发它:

  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文档的error handling部分