我一直在阅读有关处理节点错误的方法/最佳实践的文章。除了听取process.on('uncaughtException')
,这被认为是一种不好的做法,没有办法在整个应用程序中正确处理异常。
所有建议的解决方案,例如使用域,try / catch块应该实现每个模块(或者更糟糕的是,如果你使用try / catch而不是域,每个动作)。
我错过了一些文章/文档或域/ try-catch块是最好的解决方案吗?
答案 0 :(得分:0)
最好的解决方案是依赖异步代码。
异步代码显示不抛出,而是将错误传递给Callback函数,作为被调用者要处理的第一个参数。许多模块的问题在于人们似乎在他们认为这样做时会抛出这种情况,并且这种情况比实际的语法异常,类型异常或V8引发的任何异常更频繁地发生。如果您不希望您的应用程序在生产中崩溃,请使用编写良好的模块,这些模块是真正的异步并依赖于回调而不是try / catch,如果您真的需要依赖同步模块,那么请将其包装在try / catch中但是几乎总是异步模块,即使可能不执行任何I / O也会将错误传递给回调。
此外,try / catch确实具有性能开销(尽管很小),如果过度使用会对资源造成压力(不要将每个模块包装在try / catch中)。根据经验,我建议如果你正在开发一些投入生产的东西,那么试着仔细选择你的模块,而不是在以后发现它们的错误。 process.on('uncaughtException')
是最后的手段,通常是记录异常的理想选择。
作为最终解决方案,我建议您使用流程管理器。我个人的选择是PM2。它将尝试优雅地重新启动代码并很好地处理异常。
参考文献:
Try/Catch performance overhead.