代码之家  ›  专栏  ›  技术社区  ›  Alexander Mills

如何使用Vert.x捕捉异步代码中的错误

  •  0
  • Alexander Mills  · 技术社区  · 6 年前

    使用节点.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);
            })
        }
    }
    

    所以我的问题是——当使用Vertx时——如果一个请求导致并出错,我们如何防止进程崩溃?理想情况下,我们只需记录错误,然后发送请求的响应,然后继续发出咯咯声。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Alexey Soshin    6 年前

    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");
    });
    
    推荐文章