无声的javascript错误

时间:2012-11-16 21:55:15

标签: javascript mootools 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,但当然没有句柄' line:what'信息。

1 个答案:

答案 0 :(得分:5)

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

我可以立即揭穿你对无声JavaScript错误的假设。它们不存在,错误总是显示出来。 Firefox或Chrome的webdev可能存在错误,但错误就在那里。

错误最常见的方法是不要出现,因为你自己正在捕捉它们。也许过早。

我已经弄清楚我认为捕捉错误的最佳策略是什么:

<强> 1。始终抛弃Error或从Error继承的内容。

例如:不是:throw "Precondition failed",而是throw new Error("Precondition failed")

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

<强> 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函数中包装回调。因此,请调用setTimeoutsetInterval所有与DOM相关的事件,例如onclick onload ondocumentready,以及AJAX调用onreadystatechanged

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