无法从承诺中捕获异常

时间:2019-01-30 14:48:06

标签: javascript promise fetch

我在使用此代码时遇到麻烦:

fetch('/example.json')
  .then(response => Promise.all([response, response.json()])) // This line throws unhandled exception: SyntaxError: Unexpected token < in JSON at position 0
  .then(([response, json]) => {
    if (!response.ok) {
      throw new Error(JSON.stringify(json));
    }
    return json;
  })
  .catch(exception => {
    const error = new Map([
      [TypeError, ["There was a problem fetching the response."]],
      [SyntaxError, ["There was a problem parsing the response."]],
      [Error, JSON.parse(exception.message)]
    ]).get(exception.constructor);

    return { error };
  })

在大多数情况下它可以正常工作,但是当服务器的响应为200 OK时失败,但是实际内容是HTML。我知道这是服务器上的错误,但是我只希望我的客户端正确处理它。也就是说,它应该在最终捕获时捕获到response.json()异常。

我在做什么错了?

1 个答案:

答案 0 :(得分:3)

通过Bergi的评论发现了问题。

  

调用JSON.parse(exception.message)不管您遇到的实际异常是一个坏主意。

渔获物上的那条线在渔获物内引起了第二次异常,从而造成了所有麻烦。

即使未选中“暂停捕获的异常”,devtool也会停止,这似乎不适用于Promise捕获:https://bugs.chromium.org/p/chromium/issues/detail?id=465666