承诺处理错误

时间:2017-10-05 19:08:38

标签: javascript ecmascript-6 promise es6-promise

如何在Javascript承诺中处理您自己生成的错误以及库/未处理的异常?我面临的问题是由catch()承诺方法的“全能”性质产生的。

例如,我有以下代码:

somePromiseFunction()
.then(result => {
    // External library or behaviour
    someCodeThatCanThrowExceptions()

    if (result.code === 1) {
        throw 'My own exception'
    }
})
.catch(err => {
    // how do I know if this is an exception I don't know or something
    // that I do want to actually handle?
});

then()链中可能出现很多问题,外部库可能会抛出异常等等。例如,我想在发生这种情况时打印“通用错误”。

但是我也希望验证代码并提前退出(就像我在示例中所做的那样)并且在这种情况下实际打印我自己的消息“我自己的错误”。

如何处理我的“退出早期”throw和所有不同的事情,而不是在执行代码时出错?

1 个答案:

答案 0 :(得分:1)

在您的特定情况下,您抛出一个简单的字符串异常,因此您必须查看该值。

function go() {
  return new Promise(function(resolve, reject) {
    throw 'My Exception';
  });
}

const x = go()
  .then(function() {

  })
  .catch(function(ex) {
    if (ex === 'My Exception') {
      alert('It was mine');
    }
  });

如果创建更专业的异常,则可以测试类型,而不是确切的字符串。下面是一个例外情况,它遵循window.Error模式(即它有一个名称和一条消息),可以进行类型测试:

var MyError = (function() {
  function MyError(message) {
    this.message = message;
    this.name = 'MyError';
  }
  return MyError;
}());

function go() {
  return new Promise(function(resolve, reject) {
    throw new MyError('Something went wrong');
  });
}

const x = go()
  .then(function() {

  })
  .catch(function(ex) {
    if (ex instanceof MyError) {
      alert('It was mine');
    }
  });

这样做的好处是可以将消息与测试分离,以确定是否是您的错误。