Node.js 退出模块,但不退出整个NodeJS进程

Node.js 退出模块,但不退出整个NodeJS进程,node.js,callback,gulp,exit,abort,Node.js,Callback,Gulp,Exit,Abort,我有一个复杂的解析/文本处理模块,有时在回调链的深处,会遇到无法恢复的错误,基本上会: console.log('Things went bad. Aborting.'); process.exit(1); 我想从一个文件中调用这个模块。使用child\u exec()执行此操作正常。但是,require()模块,然后进行常规调用可能会更优雅 问题是在这种情况下调用process.exit()会导致整个进程退出,我不希望这样:gulpfile应该优雅地处理错误 是否有任何方法可以实现这一点,而

我有一个复杂的解析/文本处理模块,有时在回调链的深处,会遇到无法恢复的错误,基本上会:

console.log('Things went bad. Aborting.');
process.exit(1);
我想从一个文件中调用这个模块。使用
child\u exec()
执行此操作正常。但是,
require()
模块,然后进行常规调用可能会更优雅

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

是否有任何方法可以实现这一点,而不需要有效地跟踪
中止
标志,并确保在它被触发后不会继续处理?

没有方法“中止模块”。一旦加载了代码,解释器就不会跟踪代码的来源。这只是在那一点上的代码。另外,模块或模块的调用者可以有状态,并且是您,即编码者,负责在错误情况发生时保持正确的状态

这听起来好像你真的只需要编写正确的错误处理代码,一直回到一个适当的级别。对于正确的错误处理,没有神奇的快捷方式。没有模块完成。你可以做一些事情:

  • 从模块内引发异常并适当处理该异常。这只适用于同步代码,而不适用于异步代码

  • 将错误一直传播回所有调用方,以便可以在代码中的适当级别处理错误

  • 如果您使用的是异步代码,那么请使用承诺来帮助您将错误传播回正确的级别

  • 在返回结果时适当地处理所有错误

  • 如果仔细彻底地编写代码,就不应该让自己陷入不可恢复的错误中

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

    无法“中止模块”。一旦加载了代码,解释器就不会跟踪代码的来源。这只是在那一点上的代码。另外,模块或模块的调用者可以有状态,并且是您,即编码者,负责在错误情况发生时保持正确的状态

    这听起来好像你真的只需要编写正确的错误处理代码,一直回到一个适当的级别。对于正确的错误处理,没有神奇的快捷方式。没有模块完成。你可以做一些事情:

  • 从模块内引发异常并适当处理该异常。这只适用于同步代码,而不适用于异步代码

  • 将错误一直传播回所有调用方,以便可以在代码中的适当级别处理错误

  • 如果您使用的是异步代码,那么请使用承诺来帮助您将错误传播回正确的级别

  • 在返回结果时适当地处理所有错误

  • 如果仔细彻底地编写代码,就不应该让自己陷入不可恢复的错误中


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

    回答得很好,谢谢。这是一个开始有点古怪和肮脏的代码库,并且比预期的要大。我通常使用承诺(在浏览器端代码中),但在这种情况下没有特别好的理由。现在开始使用when.liftAll(fs)。回答得很好,谢谢。这是一个开始有点古怪和肮脏的代码库,并且比预期的要大。我通常使用承诺(在浏览器端代码中),但在这种情况下没有特别好的理由。现在使用when.liftAll(fs)。