Node.JS編程入門52:捕獲錯誤之“未捕獲的異常

造成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);

})

執行、用瀏覽器發起訪問,這時會報錯:

Node.JS編程入門52:捕獲錯誤之“未捕獲的異常

但程序並沒有報錯。

如果不使用process.on()捕獲這個異常,那麼:

var http = require("http");

var server = http.createServer(function(req,res){

response.end("Hello JShaman.com");

});

server.listen(8000);

顯然,當出現錯誤時,程序會退出:

Node.JS編程入門52:捕獲錯誤之“未捕獲的異常

可是,用process.on()捕獲,並使程序不退出,真的好嗎?

答案是:不好!

為什麼?

因為會造成資源洩漏、內存洩漏。

參考資料:

Node.JS編程入門52:捕獲錯誤之“未捕獲的異常

也就是說,一旦發生這種錯誤,程序是必然要崩的。

沒有立刻退出,也會因為資源洩漏,造成內存耗盡等原因而不久後退出。

正確的做法是:

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);

})

即:處理該處理的,然後退出。

Node.JS編程入門52:捕獲錯誤之“未捕獲的異常

再然後呢,自然是找到問題原因,調試並解決問題。

方法?如何調試?

使用“域”:

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);

});

使用域,可以讓發代碼運行在一個沙盒中、可以更好的監控部分代碼。如果我們懷疑哪部分代碼有問題,可以使用這種方法,監控、將錯誤提示給用戶端,當然也可以輸出日誌協助我們找到問題點、解決問題。

Node.JS編程入門52:捕獲錯誤之“未捕獲的異常




分享到:


相關文章: