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