zoukankan      html  css  js  c++  java
  • 未处理的rejection

    未处理的rejection

    当一个error没有被处理会发生什么?例如,忘了在链的尾端附加.catch,

    new Promise(function() {
      noSuchFunction(); // 这里出现 error(没有这个函数)
    })
      .then(() => {
        // 一个或多个成功的 promise 处理程序(handler)
      }); // 尾端没有 .catch!
    

    如果出现error,promise的状态将变为“rejected”,然后执行应该跳转至最近的rejection处理程序(handler)。但是上面这个例子中并没有这样的处理程序(handler),因此error会“卡住(stuck)”。没有代码来处理它。在实际开发中,就像代码中常规的未处理的error一样,这意味着某些东西出了问题。

    当发生一个常规的错误(error)并且未被try…catch捕获时会发生什么?脚本死了,并在控制台(console)中留下了一个信息。对于在promise中未被处理的rejecttion,也会发生类似的事。

    JavaScript引擎会根据此类rejection,在此种情况下会生成一个全局的error。

    在浏览器中,我们可以使用unhandledrejection事件来捕获这类error:

    window.addEventListener('unhandledrejection', function(event) {
      // 这个事件对象有两个特殊的属性:
      alert(event.promise); // [object Promise] - 生成该全局 error 的 promise
      alert(event.reason); // Error: Whoops! - 未处理的 error 对象
    });
    
    new Promise(function() {
      throw new Error("Whoops!");
    }); // 没有用来处理 error 的 catch
    

    如果出现了一个 error,并且在这儿没有 .catch,那么 unhandledrejection 处理程序(handler)就会被触发,并获取具有 error 相关信息的 event 对象,所以我们就能做一些后续处理了。

    通常此类 error 是无法恢复的,所以我们最好的解决方案是将问题告知用户,并且可以将事件报告给服务器。

    在任何情况下我们都应该有 unhandledrejection 事件处理程序(用于浏览器,以及其他环境的模拟),以跟踪未处理的 error 并告知用户(可能还有我们的服务器)有关信息,以使我们的应用程序永远不会“死掉”。

    摘录于原文链接

  • 相关阅读:
    CodeForce 677C
    1A -- Theatre Square
    CodeForce 677B Vanya and Food Processor
    CodeForce 680C Bear and Prime 100
    1B -- Spread sheet
    socket.io 推送
    网站性能测试
    openlayers/// Puppeteer.js
    div 光标处插入内容
    emjoi 表情
  • 原文地址:https://www.cnblogs.com/actorhuang/p/13960572.html
Copyright © 2011-2022 走看看