5

你如何处理超出承诺的错误(例如下面的“新错误”)?

function testError() {
    throw new Error("new error") // how to handle this?
    var p123 = new Promise(function(resolve, reject) {
         resolve(123)
    });
    return p123
};

testError().catch(err => {
        return err;  // code doesn't come here
    })
    .then(ok => {
        console.log(ok)
    });
4

5 回答 5

6

如果你不确定一个函数是否会同步抛出(或返回一个值),你可以使用.then(). 这将包装它,以便无论结果如何产生都将得到一致的处理:

function testError() {
  throw new Error("new error") // how to handle this?
  var p123 = new Promise(function(resolve, reject) {
    resolve(123)
  });
  return p123
};

Promise.resolve()
  .then(testError)
  .catch(err => {
    console.error(err);
    return err; 
  })
  .then(ok => {
    console.log(ok.message)
  });

于 2017-04-14T07:20:47.323 回答
3

由于错误不涉及异步代码,因此常规try-catch在这里应该可以正常工作:

try {
  testError().catch(err => {
    return err;  // code doesn't come here
  })
  .then(ok => {
     console.log(ok)
  });
}
catch(e) {
   // 
}

请注意,当async-await模式最终成为解决 Promise 的本机方式时,try-catch也将成为处理错误的本机方式:

try {
    var ok = await testError();
    console.log(ok)
}
catch(e) {
    console.log('e:' +e);
}

可以很容易地验证,这个可以正确处理同步和异步错误,并且比then-catch.

于 2017-04-14T07:21:20.233 回答
1

如果可以的话,testError像这样重写你的函数

function testError () {
  return new Promise(function (resolve, reject) {
     throw new Error('new error')
     resolve(123)
  })
}

testError().then(ok => console.log(ok),
                 err => console.error(err.message))

  1. 运行一次,看看它会抛出错误console.error
  2. 注释掉该throw行以查看 Promise 成功解决
于 2017-04-14T08:32:52.193 回答
0

由于错误是在 Promise 之外引发的,因此您无法使用 Promise catch 语句来捕获它。

您可以改用 try/catch 来捕获错误。

function testError() {
    throw new Error("new error") // how to handle this?
    var p123 = new Promise(function(resolve, reject) {
         resolve(123)
    });
    return p123
};

try {
  testError().then(ok => {
    console.log(ok)
  });
} catch (err) {
  console.log(err.message);
}
于 2017-04-14T07:22:06.640 回答
0

你重写它,因为让调用者检查异常和拒绝是一种反模式:

function testError() {
  return Promise.resolve().then(() => {
    throw new Error("new error"); // rejects returned promise
    return new Promise(function(resolve) {
      resolve(123);
    });
  });
}

testError().catch(err => console.log("Caught " + err));

这是async函数隐含的;他们总是回报一个承诺:

async function testError() {
  throw new Error("new error"); // rejects implicit promise
  return await new Promise(function(resolve) {
    resolve(123);
  });
}

testError().catch(err => console.log("Caught " + err));

于 2017-04-15T02:54:32.323 回答