我有一个复杂的解析/文本处理模块,有时候,在回调链的深处,会遇到不可恢复的错误,基本上会这样做:
console.log('Things went bad. Aborting.');
process.exit(1);
我想从gulp文件中调用此模块。使用child_exec()
执行此操作正常。但也许require()
模块会更优雅,然后定期打电话。
问题是在这种情况下调用process.exit()
导致整个进程退出,这是我不想要的:gulpfile应该优雅地处理错误。
有没有办法实现这一目标,不需要有效跟踪abort
标志并确保在提升后没有继续处理?
答案 0 :(得分:4)
无法中止模块"。加载代码后,解释器不会跟踪代码的来源。它就是那时的代码。加上模块或模块的调用者可以有状态,编码人员负责在发生错误情况时维护正确的状态。
这听起来像你真的只需要将正确的错误处理编码一直回到适当的级别。正确的错误处理没有神奇的捷径。没有模块做法。你可以做的一些事情:
从模块中抛出异常并适当处理异常。这只适用于同步代码,而不适用于异步代码。
通过所有呼叫者一直传播错误,以便在代码中的适当级别处理错误。
如果您正在使用异步代码,请使用promises帮助您将错误传播回正确的级别。
在返回结果时适当处理所有错误。
如果您仔细而彻底地编码,则不应该让自己陷入不可恢复的错误。
如果是回调链使得很难适当地传播错误,那么承诺可以使这更容易,因为它们提供了非常容易使用的内置错误传播机制。实际上,在编写需要处理每个可能错误的生产质量代码时,我发现promises的异步错误处理是它们最有价值的功能 - 节省时间和精力并提高代码质量。它们也有其他原因,但异步错误处理可能会对此特定项目有很大帮助。你必须" promisify"每个异步操作都可以充分利用。