Error 是經(jīng)常碰見(jiàn)缅糟,卻又不是很了解的一個(gè)對(duì)象;接下來(lái)我會(huì)總結(jié)一些 Error 的一些用法,還有 Node 對(duì)其的一些做法夜牡。
1.創(chuàng)建異常錯(cuò)誤
new Error('exception'); //創(chuàng)建一個(gè)異常錯(cuò)誤對(duì)象。
throw new Error('exception');//創(chuàng)建一個(gè)對(duì)象并拋出錯(cuò)誤侣签,如果不捕獲則 node 崩潰塘装。
//在堆棧里會(huì)顯示:message:"exception",node 并推出進(jìn)程影所。
2.try catch 捕獲異常對(duì)象
try {
throw new Error('exception')
} catch (e) {
console.log(e);
}
//node 崩潰蹦肴, 并在控制臺(tái)打印異常信息
Error: exception
at Object.<anonymous> (c:\Users\Administrator\Desktop\test\app.js:4:10)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Timeout.Module.runMain [as _onTimeout] (module.js:590:10)
at tryOnTimeout (timers.js:232:11)
at Timer.listOnTimeout (timers.js:202:5)
由上可知,error 創(chuàng)建的時(shí)候可以攜帶一些信息猴娩,并且在 error 被捕獲的時(shí)候顯示出來(lái)阴幌。
3.關(guān)于異步函數(shù)觸發(fā)異常錯(cuò)誤,是不能被try catch 捕獲的卷中。
try {
setTimeout(function () {
throw new Error('async error'); // 拋出一個(gè)異常錯(cuò)誤矛双,這是因?yàn)楫惒胶瘮?shù)執(zhí)行上下文不同,所以捕獲不到蟆豫。
}, 1000);
} catch (e) {
console.log(e);
}
所以 callback 異步風(fēng)格第一個(gè)參數(shù)都是 error议忽,不拋出錯(cuò)誤,error 傳送出去十减。
4.為了捕獲異步產(chǎn)生的異常錯(cuò)誤栈幸,可以用 domain 模塊
var domain = require('domain');
var d = domain.create();
d.run(function () {
setTimeout(function () {
throw new Error('async error'); // 拋出一個(gè)異步異常
}, 1000);
});
d.on('error', function (err) {
console.log(err); // 這里可以捕獲異步異常
});
這個(gè)模塊線上我沒(méi)用過(guò),也就是包裹異步的函數(shù)帮辟,可以相當(dāng)于try catch 包裹一樣速址。
- 還有 express 掛載接受 error 的函數(shù)
app.use(function (err,req,res,next){
//前面的中間件的錯(cuò)誤next(err),都在這里接收。
});
6.還有一個(gè)全局捕獲異常錯(cuò)誤的方法织阅,不過(guò)在這里捕獲已經(jīng)失去上下文了壳繁,但是可以防止 node 崩潰。
process.on('uncaughtException', function (err) {
});
- 我查找關(guān)于error的文章:
1.Node 出現(xiàn) uncaughtException 之后的優(yōu)雅退出方案:http://www.infoq.com/cn/articles/quit-scheme-of-node-uncaughtexception-emergence/
2.避免uncaughtException錯(cuò)誤引起node.js進(jìn)程崩潰:http://yijiebuyi.com/blog/cacbcf0838469a377054f6fab5836252.html
3.node.js 使用domain模塊捕獲異步回調(diào)中的異常:http://yijiebuyi.com/blog/6172e8bc535a75469beaf4cf85e9435f.html
4.拿什么守護(hù)你的Node.JS進(jìn)程: Node出錯(cuò)崩潰了怎么辦?:http://www.oschina.net/question/433035_171960
我的個(gè)人博客:http://liangtongzhuo.com