node處理未捕獲異常
阿新 • • 發佈:2019-02-02
nodejs最有魅力的地方就是非同步程式設計,但非同步情況下異常處理起來就比較麻煩了。
// 同步方法
var sync = function(){
throw new Error("出錯了!!!")
}
// 非同步方法
var async = function(callback){
// do something
process.nextTick(function(){
throw new Error("出錯了!!!")
callback()
})
}
同步方法異常處理是沒有問題的:
try { sync() }catch(err){ console.log(err.message) // 出錯了!!! }
非同步方法這種方式是捕獲不到的
try {
async()
}catch(err){
console.log(err.message)
// 不會列印內容
}
方法1: 遵守nodejs潛規則,將異常從回撥函式中以第一個引數傳遞出來
// 非同步方法 var async = function(callback){ // do something process.nextTick(function(){ var err = new Error("出錯了!!!"); callback(err) }) } async(function(err){ if(err){ console.log(err.message); }else{ // do something } })
方法2: process物件提供了捕獲全域性異常的方法
// 非同步方法
var async = function(callback){
// do something
process.nextTick(function(){
throw new Error("出錯了!!!")
callback()
})
}
process.on("uncaughtException", function(err){
console.log(err.message)
// 出錯了!!!
})
這種方法缺點在於它在程序退出時才處理異常,我們往往需要儘早執行
方法三: 使用domain模組建立一個子域(JS子執行環境)
var domain = require('domain').create();
domain.on("error", function(err){
console.log(err.message);
})
domain.run(function(){
async()
})