【问题标题】:Exit a module, but not the entire NodeJS process退出一个模块,但不是整个 NodeJS 进程
【发布时间】:2016-02-15 02:27:03
【问题描述】:

我有一个复杂的解析/文本处理模块,有时,在回调链的深处,会遇到不可恢复的错误并且基本上会这样做:

console.log('Things went bad. Aborting.');
process.exit(1);

我想从一个 gulp 文件中调用这个模块。使用child_exec() 可以正常工作。但也许require() 模块会更优雅,然后进行常规调用。

问题是在这种情况下调用process.exit() 会导致整个进程退出,这是我不希望的:gulpfile 应该优雅地处理错误。

有没有什么方法不需要有效地跟踪abort 标志并确保在它被引发后没有继续处理?

【问题讨论】:

    标签: node.js callback gulp exit abort


    【解决方案1】:

    没有办法“中止模块”。加载代码后,解释器不会跟踪代码的形成位置。那时它只是代码。 Plus 模块或模块的调用者可以有状态,当错误情况发生时,你,编码员,负责维护正确的状态。

    这听起来就像您真的只需要编写适当的错误处理代码,一直到适当的级别。正确的错误处理没有神奇的捷径。没有模块重做。你可以做的一些事情:

    1. 从模块内引发异常并适当处理异常。这仅适用于同步代码,不适用于异步代码。

    2. 通过所有调用者一直传播错误,以便可以在代码中的适当级别处理错误。

    3. 如果您使用的是异步代码,请使用 Promise 帮助您将错误传播回正确的级别。

    4. 在返回结果时适当处理所有错误。

    如果您仔细而彻底地编码,您不应该让自己陷入不可恢复的错误。

    如果是回调链使错误传播变得困难,那么 Promise 可以使这变得更容易,因为它们提供了一个非常易于使用的内置错误传播机制。事实上,在编写需要处理所有可能错误的生产质量代码时,我发现 Promise 的异步错误处理是它们最有价值的特性——既节省时间和精力,又提高了我的代码质量。由于其他原因,它们也很有用,但异步错误处理可能会让您对这个特定项目大有裨益。您必须“承诺”每个异步操作才能充分利用。

    【讨论】:

    • 很好的答案,谢谢。这是那些开始有点古怪和肮脏的代码库之一,并且比预期的要大。我通常使用承诺(在浏览器端代码中),但在这种情况下没有特别好的理由。现在使用when.liftAll(fs)
    猜你喜欢
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2018-05-06
    • 2018-07-28
    • 1970-01-01
    • 2011-09-22
    相关资源
    最近更新 更多