【发布时间】:2012-12-27 10:23:07
【问题描述】:
我目前正在开发一个 node.js 应用程序,并且遇到了常见的异步代码问题。
我正在 Node 的 HTTP 模块之上实现一个服务服务器。
此服务器支持(表示喜欢)路由。 例如,我的代码如下所示:
server.any("/someRoute",function(req,resp){
resp.end("this text is sent to clients via http")
});
服务器需要能够承受故障,当传递给任何的函数出现问题时,我不想让整个服务器崩溃。当我编写如下代码时会出现问题:
server.any("/someRoute",function(req,resp){
setTimeout(function(){
throw new Error("This won't get caught");
},100);
});
我看不出我怎么可能在这里发现错误。我不想因为一个服务器端故障而使服务器崩溃,而是想提供 500 个服务。
我能想出的唯一解决方案真的没有表现力。我只是想出了使用process.on("uncaughtException",callback) 和使用节点 0.8 Domains 的类似代码(这是一种部分补救措施,但域目前有问题,这仍然不是很有表现力,因为我最终不得不为每个句柄创建一个域)。
我想要完成的是将throw 动作从一个函数绑定到一个范围,理想的解决方案是将所有抛出的错误从一个函数绑定到一个特定的处理函数。
这可能吗?在这种情况下处理错误的最佳做法是什么?
我想强调的是,它应该能够在收到错误请求后继续为请求提供服务,并且在每个请求上重新启动服务器或为每个处理程序创建域并捕获它们未捕获的异常对我来说似乎是个坏主意。另外 - 我听说 promise 可以帮助我(关于 throw 在 promise 中的内容),在这种情况下 promise 可以帮助我吗?
【问题讨论】:
-
AFAIK,在诸如域之类的东西之外不可能从异步代码中捕获抛出的异常(这听起来很像“将所有抛出的错误从一个函数绑定到一个特定的处理函数”);另一种方法是使用标准的 Node.js 回调样式,其中第一个参数是错误而不是抛出(实际上这就是这种模式如此普遍的原因)。
-
我必须能够使用不是我自己编写的代码。理想的解决方案是 functionName.exceptionHandler = someFunction(exception) 之类的。
-
完全理解——但我不确定你会很容易理解。您必须拦截调用(这是 Domains 尝试对内置事件发射器执行的操作)。 (也许 JavaScript 的一些理论上的扩展——想想 CoffeeScript——可以为你生成必要的代码。)事实上,异步代码中的
throwing 是不好的形式,例如它不能是帮助(可能是JSON.parse失败等),uncaughtException事件是您保存应用程序的门票(尽管库在自己的代码中使用catch肯定会更好)。 -
@BrandonTilley 感谢您对我自己的回答的反馈
-
@BenjaminGruenbaum 你能回答这个stackoverflow.com/questions/43069522/…
标签: javascript node.js asynchronous exception-handling promise