Error 是經常碰見,卻又不是很了解的一個對象;接下來我會總結一些 Error 的一些用法,還有 Node 對其的一些做法。
1.創建異常錯誤
new Error('exception'); //創建一個異常錯誤對象。
throw new Error('exception');//創建一個對象并拋出錯誤,如果不捕獲則 node 崩潰。
//在堆棧里會顯示:message:"exception",node 并推出進程。
2.try catch 捕獲異常對象
try {
throw new Error('exception')
} catch (e) {
console.log(e);
}
//node 崩潰, 并在控制臺打印異常信息
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 創建的時候可以攜帶一些信息,并且在 error 被捕獲的時候顯示出來。
3.關于異步函數觸發異常錯誤,是不能被try catch 捕獲的。
try {
setTimeout(function () {
throw new Error('async error'); // 拋出一個異常錯誤,這是因為異步函數執行上下文不同,所以捕獲不到。
}, 1000);
} catch (e) {
console.log(e);
}
所以 callback 異步風格第一個參數都是 error,不拋出錯誤,error 傳送出去。
4.為了捕獲異步產生的異常錯誤,可以用 domain 模塊
var domain = require('domain');
var d = domain.create();
d.run(function () {
setTimeout(function () {
throw new Error('async error'); // 拋出一個異步異常
}, 1000);
});
d.on('error', function (err) {
console.log(err); // 這里可以捕獲異步異常
});
這個模塊線上我沒用過,也就是包裹異步的函數,可以相當于try catch 包裹一樣。
- 還有 express 掛載接受 error 的函數
app.use(function (err,req,res,next){
//前面的中間件的錯誤next(err),都在這里接收。
});
6.還有一個全局捕獲異常錯誤的方法,不過在這里捕獲已經失去上下文了,但是可以防止 node 崩潰。
process.on('uncaughtException', function (err) {
});
- 我查找關于error的文章:
1.Node 出現 uncaughtException 之后的優雅退出方案:http://www.infoq.com/cn/articles/quit-scheme-of-node-uncaughtexception-emergence/
2.避免uncaughtException錯誤引起node.js進程崩潰:http://yijiebuyi.com/blog/cacbcf0838469a377054f6fab5836252.html
3.node.js 使用domain模塊捕獲異步回調中的異常:http://yijiebuyi.com/blog/6172e8bc535a75469beaf4cf85e9435f.html
4.拿什么守護你的Node.JS進程: Node出錯崩潰了怎么辦?:http://www.oschina.net/question/433035_171960
我的個人博客:http://liangtongzhuo.com