node處理未捕獲異常

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()
})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章