说我有一些中间件,并且引发了错误:
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.");
});
答案 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();
}
}