使用Vert.x处理在请求中间件中引发的错误

时间:2019-01-28 03:11:58

标签: java vert.x

说我有一些中间件,并且引发了错误:

public class JWTHandler implements Handler<RoutingContext> {

  public void handle(RoutingContext ctx) {
    throw new Error("How can I capture this error and send a response.")
    ctx.next();
  }
}

如何使用一些错误处理中间件捕获它?这是一个全局错误处理程序,但是它不能引用任何请求/响应对。

vertx.createHttpServer()
  .exceptionHandler(ctx -> {

    // I cannot access the request that may have caused the error here
    log.error("In the exception handler.");
    log.error(ctx.getCause());

  })

我唯一能猜到的就是这样:

public class ErrorHandler implements Handler<RoutingContext> {

  public void handle(RoutingContext ctx) {
    try{
      ctx.next();
    }
    catch(Exception e){
       ctx.response().end("We messed up.");
    }
  }
}

但是我怀疑这个主意是对的吗?什么是正确的方法?

也许这两个都足够?

router.route().failureHandler(ctx -> {
   ctx.response().end("We failed here!");
});

router.route().last().handler(ctx -> {
  ctx.response()
    .setStatusCode(404)
    .end("404 - route/resource could not be found.");
});

1 个答案:

答案 0 :(得分:2)

我认为,正确的方法是在引发异常时使用ctx.fail()

public class JWTHandler implements Handler<RoutingContext> {
  public void handle(RoutingContext ctx) {
    ctx.fail(new Error("How can I capture this error and send a response.");
  }
}

然后您可以添加failerHandler并使用ctx.failure()来访问异常

router.route().failureHandler(ctx -> {
   ctx.response().end(
    ctx.failure().getMessage()
   );
});

编辑:

failureHandler还捕获像您一样抛出的异常:

public class JWTHandler implements Handler<RoutingContext> {
  public void handle(RoutingContext ctx) {
    throw new Error("How can I capture this error and send a response.")
    ctx.next();
  }
}