让我疯狂的一件事是Javascript在许多不同的情况下如何无声地失败。
(删除示例,因为它混淆了我的问题点)
很多时候我遇到了一个错误,当它输入到Firebug控制台时会出现错误信息,但是当它在页面脚本中运行时,它会无声地失败,即使Firebug控制台处于活动状态并且处于打开状态!< /强>
其中一些问题可以被克罗克福德的JsLint捕获,但仍然有很多人不会。
是否有办法在浏览器中启用更多错误消息?
你可以在不使用javascript调试环境的情况下完成这项工作吗?我觉得调试器对我帮助不大。我通常会撒上一些console.log()语句,可以在一分钟内找到问题所在。让我疯狂的是,Javascript中的无声错误很长一段时间都会被忽视,或者以一种根本不明显的方式出现。更令人沮丧的是因为在控制台中测试语句会出错,所以发生了什么?
顺便提一句,我遇到了同样的问题,是否有人注意到这一点?通常我的throw new
语句根本不起作用。但是如果我在控制台中输入相同的内容,那就确实如此。
感谢您的有用评论(第一个答案),但这不是我的问题。当您需要清理类的参数时,例如,当您不确定环境时,这些测试非常有用。您不希望测试您期望它们在哪里的属性或类的存在;这无疑会使代码膨胀。
答案 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
}