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()
})