nodejs异常处理

okgoes 2023-05-09 13:07:15
Categories: Tags:

在nodejs开发中,异常处理十分麻烦。一下代码捕捉不到错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function async_error() {
    setTimeout(function(){
            throw new Error("Error");
    },10)
}

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

run();

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

1
2
3
4
5
6
7
8
9
10
11
12
function async_error() {
    setTimeout(function(){
     try{
     throw new Error("Error");
     }catch(e){
     console.log(e);
     }
            
    },10)
}

async_error();

如果函数嵌套过多,就会变成这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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里,这个就变的很简单。

1
2
3
4
5
6
7
8
9
10
11
functiong(){
  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来控制流程

1
2
3
4
5
6
7
8
9
10
11
var async = require('async');
async.series([
function(cb){
cb(null);
},
function(cb){
cb(new Error("Error"));
}
],function(err){
console.log(err);
});

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

那么使用promise呢

1
2
3
4
5
6
7
8
9
10
11
12
13
var promise = new Promise(function(resolve, reject) {
  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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'));