有什么方法可以阻止Javascript无声地失败?

时间:2010-10-15 10:42:44

标签: javascript debugging exception-handling firebug

让我疯狂的一件事是Javascript在许多不同的情况下如何无声地失败。

(删除示例,因为它混淆了我的问题点)

很多时候我遇到了一个错误,当它输入到Firebug控制台时会出现错误信息,但是当它在页面脚本中运行时,它会无声地失败,即使Firebug控制台处于活动状态并且处于打开状态!< /强>

其中一些问题可以被克罗克福德的JsLint捕获,但仍然有很多人不会。

是否有办法在浏览器中启用更多错误消息?

你可以在不使用javascript调试环境的情况下完成这项工作吗?我觉得调试器对我帮助不大。我通常会撒上一些console.log()语句,可以在一分钟内找到问题所在。让我疯狂的是,Javascript中的无声错误很长一段时间都会被忽视,或者以一种根本不明显的方式出现。更令人沮丧的是因为在控制台中测试语句会出错,所以发生了什么?

顺便提一句,我遇到了同样的问题,是否有人注意到这一点?通常我的throw new语句根本不起作用。但是如果我在控制台中输入相同的内容,那就确实如此。

感谢您的有用评论(第一个答案),但这不是我的问题。当您需要清理类的参数时,例如,当您不确定环境时,这些测试非常有用。您不希望测试您期望它们在哪里的属性或类的存在;这无疑会使代码膨胀。

4 个答案:

答案 0 :(得分:6)

我认为这个问题的一些答案是误解了这个问题。 IIUC,问题是当这个代码在真实网页内运行时,错误压制,但是OP并不想它。 (大概是为了调试目的,主要是。)

我的问题是,这个代码真正在网站的上下文中运行在哪里?机会是其他东西在它到达你之前压制错误。例如,某些库本能地压制在特定回调中发生的错误(例如,对于XHR)。但是,如果它们很好,它们也倾向于在发生错误时提供接收通知的挂钩点。

答案 1 :(得分:5)

以下代码将捕获catch块中的所有错误:

var a;
try {
    a = new Foo.Apple();
} catch (err) {
    // Error handling
}

了解更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch

答案 2 :(得分:4)

如果您正在使用您不确定它们是否在运行时存在的对象,则必须检查它们是否存在:

if (Foo && Foo.Apple) {
    // exists, do something with it
} else {
    // doesn't exist, do Plan B
}

请注意,表达式(Foo&amp;&amp; Foo.Apple)将首先检查Foo是否存在,并且只有在它存在的情况下才会检查它是否具有名为Apple的属性。如果有,则if分支将执行。

如果Foo不存在,或者它不包含Apple属性,则else分支将执行。

答案 3 :(得分:3)

同意@sime Vidas,如果必须处理异常而不是保持静默,首先使用布尔条件并检查该值是否存在。

if(Foo.Apple){
\\your code
}
else
{
//Foo.Apple does not exist, do some exception handling here
}