ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

无声的javascript错误

2019-09-01 14:33:56  阅读:234  来源: 互联网

标签:mootools javascript runtime-error


这可能是一个糟糕的问题,但我注意到,因为我正在使用mootools编写代码当我有一些代码经过回调,绑定并且通常不仅仅是一个简单的函数调用,如果有的话错误它没有被Firebug或Chrome的控制台拿起它只是默默地失败,我被迫使用trys跟踪错误,这样就不会给你提供方便的信息,比如失败的代码行.这就像为IE6编写代码所有你必须要做的是一些不透明的消息,比如’无法读取’未定义的’x’.

我意识到这个问题不够具体,不能问’我该如何避免这种情况’,但其他人是否遇到过这个问题,如果是这样,你怎么解决它?我也有点困惑如何通过try / catch块获取错误,而不是javascript控制台.

编辑:

好的,我想出了一些可以重现错误的东西

说你有功能

function foo(){
   var x = value.blah;
}

如果我像foo()那样调用该函数,我在控制台中正确地得到了一个引用错误.但是,如果我称之为

(function(){
   foo.attempt();
})()

我在控制台中没有错误,但如果我改变了foo

function foo(){
   try{
   var x = value.blah;
   } catch(e){console.log(e)}
}

控制台将记录e,但当然没有句柄’行:无论什么’信息.

解决方法:

我在填补JavaScript错误方面有相当丰富的经验.我主要使用Chrome来建立我的理解,但大多数也适用于Firefox和Internet Explorer.

我可以立即揭穿你关于无声JavaScript错误的假设.它们不存在,错误总是显示出来. Firefox或Chrome的webdev中可能存在错误,但错误存在.

不出现错误的最常见方式是因为你自己捕捉它们.也许是过早的.

我已经想出了我认为捕获错误的最佳策略:

1.总是抛出错误或从错误中继承的东西.

例如:不:抛出“前提条件失败”但抛出新错误(“前提条件失败”).

这是因为JavaScript中的错误很奇怪(我没有其他的说法).如果你想要一个堆栈跟踪(天堂是的,你想要一个堆栈跟踪),你需要抛出一个错误(而不是一个字符串).

2.不要使用window.onerror这里不多说.这毫无用处.你无法控制这个函数的内容.它可能是您的代码,它可能是访问者使用的破坏插件.此外,没有堆栈跟踪.

3.有一个(全局)错误处理程序/何时捕获错误

JavaScript是事件驱动的.这有一些意想不到的后果.请注意以下代码:

try {
    setTimeout(function () {
        throw new Error("nope! :D");
    }, 1);
} catch (e) {
    console.log(e);
}

你不会看到这个错误. (Firebug /控制台会抓住它)

这是因为内部函数在它自己的事件中运行,而try-catch语句不再适用于它.正确的方法是:

try {
    setTimeout(function () {
        try {
            throw new Error("nope! :D");
        } catch (e) {
            console.log("Hell yea!", e);
        }
    }, 1);
} catch (e) {
    console.log(e);
}

或者只是创建一个在try-catch中包装函数的函数:

function wrap(wrap_dat_func) {
    return function () {
        try {
            wrap_dat_func.apply(wrap_dat_func, arguments);
        } catch (e) {
            // send to error handler
        }
   }
}

使用如下:

setTimeout(wrap(function () {
    // etc
}), 1);

所以基本上每当你生成一个新事件时,将回调包装在你的全局try catch函数中.所以包装调用setTimeout,setInterval所有与DOM相关的事件,如onclick onl oad ondocumentready,以及AJAX调用onreadystatechanged.

如何获得适当的堆栈跟踪(通过事件!)是另一个冗长的解释.

标签:mootools,javascript,runtime-error
来源: https://codeday.me/bug/20190901/1784139.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有