首页 > 解决方案 > 如何使用 Vert.x 捕获异步代码中的错误

问题描述

使用 Node.js,我们可能会使用域来捕获异步代码中抛出的错误,如下所示: https ://medium.com/@the1mills/using-node-js-domains-in-production-797105a4c302

以这种方式使用域允许我们将错误固定到特定请求,以便我们可以发送响应并进行清理,并允许我们的服务继续运行。

使用 Golang,我们可以使用这样的错误处理中间件来捕获错误并将其固定到特定请求。

func Error() Adapter {
    return func(next http.HandlerFunc) http.HandlerFunc {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            defer func() {
                if err := recover(); err != nil {

                    log.Error("Caught error in defer/recover middleware: ", err)

                    // ...

                    json.NewEncoder(w).Encode(struct {
                        Message string
                    }{
                        message,
                    })

                }
            }()

            log.Info("We are handling errors with defer.")
            //next.ServeHTTP(w, r)
            next(w,r);
        })
    }
}

您可能已经知道,错误中间件只是在调用任何其他 api 路由之前注册,如果发生恐慌,延迟将捕获它。我不确定它是否适用于“子 goroutines”,但它适用于当前正在运行的 goroutine。

所以我的问题是 - 在使用 Vertx 时 - 如果一个请求导致错误,我们如何防止我们的进程崩溃?理想情况下,我们可以只记录错误,并针对该请求发送响应并继续运行。

标签: vert.xvertx-verticle

解决方案


使用 Vert.x,您无需:

Vertx vertx = Vertx.vertx();

Router router = Router.router(vertx);

router.get("/").handler((req) -> {
    System.out.println("Got something");
    // We crash
    throw new RuntimeException();
});

vertx.createHttpServer().requestHandler(router).listen(8080);

运行这个例子,你会看到 Vert.x 捕获了异常。

但是,假设您想自己进行一些错误处理。然后errorHandler()用于:

router.errorHandler(500, (ctx) -> {
    ctx.response().end("Got something bad");
});

推荐阅读