造成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);
})
执行、用浏览器发起访问,这时会报错:
![e7adfeae1c493e5f68d577d57ea9b09b.png](https://i-blog.csdnimg.cn/blog_migrate/0d49c044bc27b69551499262a0098b48.jpeg)
但程序并没有报错。
如果不使用process.on()捕获这个异常,那么:
var http = require("http");
var server = http.createServer(function(req,res){
response.end("Hello JShaman.com");
});
server.listen(8000);
显然,当出现错误时,程序会退出:
![53d8884b1bbf0993411182251283f0ea.png](https://i-blog.csdnimg.cn/blog_migrate/f5057d9350ac4e43ce41c370546f5f5a.jpeg)
可是,用process.on()捕获,并使程序不退出,真的好吗?
答案是:不好!
为什么?
因为会造成资源泄漏、内存泄漏。
参考资料:
![105c3001e4229a4acbec6061c70f3008.png](https://i-blog.csdnimg.cn/blog_migrate/c757a5958a597283a813eee604272af9.jpeg)
也就是说,一旦发生这种错误,程序是必然要崩的。
没有立刻退出,也会因为资源泄漏,造成内存耗尽等原因而不久后退出。
正确的做法是:
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);
})
即:处理该处理的,然后退出。
![ee7523613e2d3ff59fb687de46baa527.png](https://i-blog.csdnimg.cn/blog_migrate/94192bede86587d6f6856599689cac5a.jpeg)
再然后呢,自然是找到问题原因,调试并解决问题。
方法?如何调试?
使用“域”:
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);
});
使用域,可以让发代码运行在一个沙盒中、可以更好的监控部分代码。如果我们怀疑哪部分代码有问题,可以使用这种方法,监控、将错误提示给用户端,当然也可以输出日志协助我们找到问题点、解决问题。
![991e1302f0a04dd05269e86b8e2b8984.png](https://i-blog.csdnimg.cn/blog_migrate/f5f412afdfc6d12e037707bdb4cfc984.jpeg)
更