这可能是一个不好的问题,但是我已经注意到,因为我正在使用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'信息。
答案 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函数中包装回调。因此,请调用setTimeout
,setInterval
所有与DOM相关的事件,例如onclick
onload
ondocumentready
,以及AJAX调用onreadystatechanged
。
如何获得适当的堆栈跟踪(通过事件!)是另一个冗长的解释。