【发布时间】:2016-03-03 09:29:49
【问题描述】:
domain built-in module 将被弃用:
稳定性:0 - 已弃用
此模块正在等待弃用。一旦替换 API 完成,此模块将被完全弃用。大多数最终用户应该没有理由使用这个模块。绝对必须拥有域提供的功能的用户可能暂时依赖它,但预计将来必须迁移到不同的解决方案。
据此,他们目前并不真正推荐解决方案。但是如何实现类似于以下的功能:
var d = require('domain').create();
d.on('error', function(err) {
console.log(err);
});
d.run(function() {
setTimeout(function () {
throw new Error("Something went really wrong in async code.");
}, 1000);
});
因此,这会处理异步内容引发的错误,但不推荐使用 domain 模块。
如何将此代码迁移到更好的地方?
我的用例是我正在编写一个接受函数作为输入的库,它运行该函数并显示结果(实际上,您可以将其视为单元测试库):
myLib.it("should do something", function (done) {
setTimeout(function () {
// Some async code
// ...
// But here an error is thrown
throw new Error("dummy");
}, 1000);
});
显然,在这种情况下,我不想让进程崩溃,但我确实想显示一个很好的错误(所以基本上是在这个函数中捕获错误)。
目前在我做的图书馆里:
var err = null;
try {
fn(callback);
} catch (e) {
err = e;
}
console.log(err || "Everything went correctly");
【问题讨论】:
-
全局错误处理程序在 node.js 中除了关闭你的服务器之外真的没有任何作用,因为他们无法确切知道问题的上下文以及如何恢复。如今,更好的方案是对所有异步代码使用 Promise,然后至少在您可以实际处理错误的 Promise 的顶层捕获错误。 Promise 会自动为您捕获异常并将它们转换为 Promise 错误处理程序。
-
@jfriend00 就我而言,我无法控制它,因为这是用户提供的功能,我真的不想在发生错误时中断进程。也许
vm模块可能是一个解决方案? -
用户提供的代码可能会对您的服务器造成可怕的影响,除非您在单独的沙盒进程中运行它,否则您无法保护自己免受它的侵害。
vm模块可能会被证明是有用的,但即使那样你也必须小心。 -
@jfriend00 在我的情况下,开发人员将代码作为函数提供,我正在编写的库应该处理函数中的任何错误。
-
您无法在开发人员提供的代码中捕获异步操作中的错误。他们只是不会冒泡到顶层。你可以尝试/捕捉任何你称之为他们的东西,这就是你所能做的。除此之外,开发人员提供的代码是否能够聪明地处理自己的错误。
标签: javascript node.js asynchronous try-catch