Node系列——Node系列中异常捕获的一个重要思考

    不管是经过process对象的uncaughtException事件捕获到全局异常,仍是经过子域对象的error事件捕获到了子域异常,在NodeJS官方文档里都强烈建议处理完异常后当即重启程序,而不是让程序继续运行。按照官方文档的说法,发生异常后的程序处于一个不肯定的运行状态,若是不当即退出的话,程序可能会发生严重内存泄漏,也可能表现得很奇怪。git

    但这里须要澄清一些事实。JS自己的throw..try..catch异常处理机制并不会致使内存泄漏,也不会让程序 的执行结果出乎意料,但NodeJS并非存粹的JS。NodeJS里大量的API内部是用C/C++实现的,所以NodeJS程序的运行过程当中,代码执 行路径穿梭于JS引擎内部和外部,而JS的异常抛出机制可能会打断正常的代码执行流程,致使C/C++部分的代码表现异常,进而致使内存泄漏等问题。github

    所以,使用uncaughtExceptiondomain捕获异常,代码执行路径里涉及到了C/C++部分的代码时,若是不能肯定是否会致使内存泄漏等问题,最好在处理完异常后重启程序比较稳当。而使用try语句捕获异常时通常捕获到的都是JS自己的异常,不用担忧上诉问题。dom

    咱们经过中间件的形式,引入domain来处理异步中的异常。固然,domain虽然捕捉到了异常,可是仍是因为异常而致使的堆栈丢失会致使内存泄漏,因此出现这种状况的时候仍是须要重启这个进程的,有兴趣的同窗能够去看看domain-middleware这个domain中间件。异步

相关文章
相关标签/搜索