热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在承诺中捕捉未被发现的异常-HowtocatchuncaughtexceptioninPromise

IsthereanywaytogloballycatchallexceptionsincludingPromiseexceptions.Example:是否有办法全局捕获所有

Is there any way to globally catch all exceptions including Promise exceptions. Example:

是否有办法全局捕获所有异常,包括承诺异常。例子:

    window.Onerror= function myErrorHandler(errorMsg, url, lineNumber) {
        alert("Error occured: " + errorMsg);//or any message
        return false;
    }

    var myClass = function(){

    }


    var pr = new Promise(function(resolve, react){
        var myInstance = new myClass();
        myInstance.undefinedFunction(); // this will throw Exception
        resolve(myInstance);
    });


    pr.then(function(result){
        console.log(result);
    });

    // i know right will be this:
    // pr.then(function(result){
    //     console.log(result);
    // }).catch(function(e){
    //     console.log(e);
    // });

This script will silently die without error. Nothing in firebug.

这个脚本将无声地死去,不会出错。firebug。

My question is if I do a mistake and forgot to catch it is there any way to catch it globally?

我的问题是,如果我犯了一个错误,却忘了抓住它,有没有办法在全球范围内抓住它?

5 个解决方案

#1


18  

Update, native promises now do the following in most browsers:

更新,本地承诺现在在大多数浏览器做以下事情:

window.addEventListener("unhandledrejection", function(err, promise) { 
    // handle error here, for example log   
});

We were just discussing this the other day.

前几天我们刚刚讨论过这个问题。

Here is how you'd do this with bluebird:

这是你如何对付蓝鸟的方法:

window.Onpossiblyunhandledexception= function(){
    window.onerror.apply(this, arguments); // call
}

window.Onerror= function(err){
    console.log(err); // logs all errors
}

With Bluebird it's also possible to use Promise.onPossiblyUnhandledRejection. The calls for done are not needed as the library will detect unhandled rejection itself unlike Q (UPDATE 2016 - I now wrote code for Q and it does this).

对于蓝鸟来说,也可以使用promi .on表示不可能完成的任务。不需要调用done,因为库将检测未处理的拒绝本身,不像Q(更新2016 -我现在为Q编写代码,它这样做)。

As for native promises - they will eventually report to either window.onerror or a new handler but the specification process is not yet done - you can follow it here.

至于本地承诺——它们最终将向任一窗口报告。onerror或新的处理程序,但是规范过程还没有完成——您可以在这里跟踪它。

#2


15  

Most promise implementations don't currently provide the type of functionality you are referring to, but a number of 3rd-party promise libraries (including Q and bluebird) provide a done() method that will catch and rethrow any uncaught errors, thus outputting them to the console.

大多数承诺实现目前不提供您正在引用的功能类型,但是许多第三方承诺库(包括Q和bluebird)提供了一个done()方法,可以捕获和重新抛出未捕获的错误,从而将它们输出到控制台。

(Edit: see Benjamin Gruenbaum's answer about Bluebird's features for handling uncaught exceptions)

(编辑:参见本杰明·格伦鲍姆(Benjamin Gruenbaum)关于知更鸟处理未捕获异常的特性的回答)

So if you have that, you'd just need to follow the rule of thumb that any promise you use should either be returned or terminated with .done():

因此,如果你有这样的经验,你只需要遵循经验法则,你使用的任何承诺都应该被退回或终止。

pr.then(function(result){
    console.log(result);
})
.done();

To quote from the Q API reference:

引用Q API参考:

The Golden Rule of done vs. then usage is: either return your promise to someone else, or if the chain ends with you, call done to terminate it. Terminating with catch is not sufficient because the catch handler may itself throw an error.

“完成”和“使用”的黄金法则是:要么把你的承诺归还给别人,要么,如果链终止于你,你就可以终止它。使用catch终止是不够的,因为catch处理程序本身可能抛出错误。

I realize that this still requires a bit of extra work and you can still forget to do this, but it is an improvement over having to .catch() and explicitly handle every error, especially for the reason pointed out above.

我意识到这仍然需要一些额外的工作,您仍然可以忘记这样做,但是这比必须要.catch()并显式地处理每个错误要好,特别是由于上面提到的原因。

#3


4  

In Node.js, you can use:

在节点。js,您可以使用:

process.on('unhandledRejection', (reason, promise) => {
  console.error(`Uncaught error in`, promise);
});

#4


2  

If you're writing code that can be executed both in a browser & in a Node.js environment, you could wrap your code in a self-executing function like this :

如果您正在编写可以在浏览器和节点中执行的代码。js环境下,可以将代码封装在一个自执行函数中,如下所示:

var isNode = (typeof process !== 'undefined' && typeof process.on !== 'undefined');
(function(on, unhandledRejection) {
    // PUT ANY CODE HERE
    on(unhandledRejection, function(error, promise) {
        console.error(`Uncaught error in`, promise);
    });
    // PUT ANY CODE HERE
})(
    isNode ? process.on.bind(process) : window.addEventListener.bind(window),
    isNode ? "unhandledRejection" : "unhandledrejection"
);

What would happen if you use this code :

如果您使用此代码会发生什么:

  • If you'd run it in a Node.js environment, your handler would be attached to the process object and be executed when you have an uncaught exception in a promise.

    如果你在一个节点上运行它。在js环境中,您的处理程序将被附加到流程对象,并在承诺中出现未捕获异常时执行。

  • If you'd run it in a browser environment, your handler would be attached to the window object and be executed when you have an uncaught exception in a promise and your browser supports the unhandledrejection event.

    如果您在浏览器环境中运行它,您的处理程序将被附加到窗口对象,当您在一个承诺中有一个未被捕获的异常并且您的浏览器支持unhandledrejection事件时将被执行。

  • If you'd run it in a browser environment without support for the unhandledrejection, you will not be able to catch your uncaught exception and your unhandledrejection event handler will never be triggered, but you would not get any errors if there's no uncaught exceptions.

    如果您在不支持unhandledrejection的浏览器环境中运行它,您将无法捕获未捕获的异常,也不会触发unhandledrejection事件处理程序,但是如果没有未捕获的异常,您将不会得到任何错误。

#5


0  

If you are using native Promise, it's pretty simple.
You only need to .catch this reject some where.

如果你使用的是原生承诺,这很简单。你只需要。抓住这个拒绝的地方。

ajax(request).catch(function(rejected){
      console.log(rejected);
});

If I don't catch it somewhere, the uncaught in promise will keep showing. But If I catch it somewhere...

如果我没有在某个地方发现它,未被发现的承诺将继续显现。但是如果我在什么地方抓到它……


推荐阅读
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 我在使用 AngularJS 的路由功能开发单页应用 (SPA),但需要支持 IE7(包括 IE8 的 IE7 兼容模式)。我希望浏览器的历史记录功能能够正常工作,即使需要使用 jQuery 插件。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
author-avatar
我想去海边6_414
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有