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()})新闻热点
疑难解答