vert.x - 如何使用 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.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");
});
推荐阅读
- ruby-on-rails - 在 Rails 应用程序中链接到主页上的最新帖子
- node.js - 如果未定义,则不插入更新值
- java - 如何锁定写入文件以使其他消费者无法使用
- powershell - 使用 Invoke-Webrequest 的无效正文
- java - 如何在java中返回多维arrayList?
- javascript - 使用 setInterval Javascript 时未捕获的 SyntaxError
- spring - 在 Spring JPA 中插入实体列表的最佳方法
- angularjs - 对于带有 ReactJS/AngularJS 的 ADAL.js(或 MSAL),处理框架版本控制的最佳方法是什么
- java - Java Regex Matcher 跳过匹配项
- java - 双向链表 - RemoveFirst 方法