nodejs 错误处理机制
发布于 15天前 作者 zhangking520 297 次浏览 来自 分享

原文 http://www.helix.name/nodejs-yi-chang-chu-li/ 在nodejs开发中,异常处理十分麻烦。 大家应该知道,以下的代码是捕获不到错误的。

function async_error() {
    setTimeout(function(){
            throw new Error("Error");
    },10)
}

function run() {
    try {
        async_error();
    } catch (err) {
        console.log(err);
    }
}

run();

在回调函数内捕获错误,我们不得不在异步函数内写错误处理语句。

function async_error() {
    setTimeout(function(){
            try{
                throw new Error("Error");
            }catch(e){
                console.log(e);
            }
            
    },10)
}

async_error();

如果函数嵌套过多,就会变成这样(来自http://es6.ruanyifeng.com/#docs/generator)

foo('a', function (a) {
  if (a.error) {
    throw new Error(a.error);
  }

  foo('b', function (b) {
    if (b.error) {
      throw new Error(b.error);
    }

    foo('c', function (c) {
      if (c.error) {
        throw new Error(c.error);
      }

      console.log(a, b, c);
    });
  });
});

但是,在es6里,这个就变的很简单。

function* g(){
  try {
    var a = yield foo('a');
    var b = yield foo('b');
    var c = yield foo('c');
  } catch (e) {
    console.log(e);
  }

  console.log(a, b, c);
}

接着,我们来看看,异步流程控制库是如何处理错误的。

如果我们使用async来控制流程


var async = require('async');
async.series([
    function(cb){
            cb(null);
    },
    function(cb){
            cb(new Error("Error"));
    }
    ],function(err){
    console.log(err);   
});

async串行执行函数过程中,一旦错误,就会停止执行剩下的函数,直接执行结果回调函数。这样就统一处理错误,变得很清晰。

那么使用promise呢

var promise = new Promise(function(resolve, reject) {
  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

promise.then(function(value) {
  // success
}, function(value) {
  // failure
});

promise中每个函数执行都有一个错误处理函数。

流程控制库帮助我们简化来错误处理机制。

另外,我们也可以用 events 来帮助触发错误处理函数。

var events = require('events');
var util = require('util');

function A(){
    events.EventEmitter.call(this);
}
util.inherits(A, events.EventEmitter);

var a = new A();

a.on('error',function(e){
    console.log(e)
});

a.emit('error',new Error('a'));

大家来说说错误处理的经验吧

4 回复

麻一个

es6 里的 try catch,要 throw exception 吧

错误机制错误可以读下这片文章视野会开阔很多 http://segmentfault.com/a/1190000002741935

@xiaxiaokang 谢谢 的确十分详细

promise 方式很好用,甚至q.js 甚至实现了 catch , finally 的类似方式。

回到顶部