退出一个模块,但不退出整个 NodeJS 进程

Exit a module, but not the entire NodeJS process

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

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

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

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

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

没办法"abort a module"。加载代码后,解释器不会跟踪代码的来源。那时只是代码。 Plus 模块或模块的调用者可以有状态,是你,编码员,负责在发生错误情况时维护正确的状态。

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

  1. 从模块内部抛出异常并适当处理异常。这只适用于同步代码,不适用于异步代码。

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

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

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

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

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