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中間件。異步

相關文章
相關標籤/搜索