繁体   English   中英

退出模块,但不退出整个NodeJS流程

[英]Exit a module, but not the entire NodeJS process

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

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

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

问题在于,在这种情况下调用process.exit()会导致整个过程退出,而我不希望这样做:gulpfile应该正常处理该错误。

有什么方法可以实现,而又不需要有效地跟踪abort标志并确保在引发abort后没有任何处理继续进行?

无法“中止模块”。 加载代码后,解释器将不会跟踪代码从何而来。 那时只是代码。 Plus模块或模块的调用者可以具有状态,而当发生错误情况时,由您(编码器)负责维护正确的状态。

听起来您真的只需要编码适当的错误处理,一直到适当的级别即可。 没有适当的错误处理魔术快捷方式。 没有模块接管。 您可以做的一些事情:

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

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

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

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

如果仔细而彻底地编写代码,则不应陷入不可恢复的错误。

如果是回调链使得很难正确地传播错误,那么promise可以使这一点变得更加容易,因为它们提供了非常易于使用的内置错误传播机制。 实际上,在编写需要处理每个可能的错误的生产质量代码时,我发现promise的异步错误处理是它们最有价值的功能-节省时间和精力,并提高代码质量。 它们也因其他原因很有用,但是异步错误处理可能对此特定项目有很大帮助。 您必须“承诺”每个异步操作才能充分利用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM