造成Node程序崩潰的,幾乎都是“未捕獲的異常”。
當一個“未捕獲的異常”出現時,Node會默認的終止進程的執行。
其實process.on()方法可以捕獲進程級的異常,如:
var http = require("http");
var server = http.createServer(function(req,res){
response.end("Hello JShaman.com");
});
server.listen(8000);
process.on("uncaughtException",function(err){
console.error(err.message,err.stack);
})
執行、用瀏覽器發起訪問,這時會報錯:
但程序並沒有報錯。
如果不使用process.on()捕獲這個異常,那麼:
var http = require("http");
var server = http.createServer(function(req,res){
response.end("Hello JShaman.com");
});
server.listen(8000);
顯然,當出現錯誤時,程序會退出:
可是,用process.on()捕獲,並使程序不退出,真的好嗎?
答案是:不好!
為什麼?
因為會造成資源洩漏、內存洩漏。
參考資料:
也就是說,一旦發生這種錯誤,程序是必然要崩的。
沒有立刻退出,也會因為資源洩漏,造成內存耗盡等原因而不久後退出。
正確的做法是:
var http = require("http");
var server = http.createServer(function(req,res){
response.end("Hello JShaman.com");
});
server.listen(8000);
process.on("uncaughtException",function(err){
console.error(err.message,err.stack);
server.close();
setTimeout(process.exit(),3000);
})
即:處理該處理的,然後退出。
再然後呢,自然是找到問題原因,調試並解決問題。
方法?如何調試?
使用“域”:
var http = require("http");
var domain = require("domain");
var d = domain.create();
d.run(function(){
var server = http.createServer(function(req,res){
d.on("error",function(er){
res.statusCode = 500;
res.end("internal server error");
server.close();
setTimeout(process.exit(),3000,1);
})
response.end("Hello JShaman.com");
});
server.listen(8000);
});
使用域,可以讓發代碼運行在一個沙盒中、可以更好的監控部分代碼。如果我們懷疑哪部分代碼有問題,可以使用這種方法,監控、將錯誤提示給用戶端,當然也可以輸出日誌協助我們找到問題點、解決問題。
更