JavaScript尝试捕获
我正在看一个网站上的一些代码,它在点击时隐藏/显示内容JavaScript尝试捕获,javascript,Javascript,我正在看一个网站上的一些代码,它在点击时隐藏/显示内容 function expando() { try { if (document.getElementsByClassName) { var e = document.getElementsByClassName("expandlink"); t = 0; } else {
function expando() {
try {
if (document.getElementsByClassName) {
var e = document.getElementsByClassName("expandlink");
t = 0;
} else {
var e = document.querySelectorAll(".expandlink"),
t = 1;
};
if (null != e) {
for (var a = 0; a < e.length; ++a) e[a].onclick = function() {
return OpenClose(this), !1
};
if (1 == t)
for (var a = 0; a < e.length; ++a) {
var n = e[a].href,
r = n.indexOf("#"),
i = n.substr(r + 1),
l = document.getElementById(i);
l.className = l.className + " expandtargetIE8"
}
}
} catch (o) {}
}
function OpenClose(e) {
try {
var t = e.href,
a = t.indexOf("#"),
n = t.substr(a + 1),
r = document.getElementById(n);
r.className = "expandtarget" === r.className ||
"expandtarget expandtargetIE8" === r.className ?
"expandtargeted" : "expandtarget expandtargetIE8",
e.className = "expandlink" === e.className ?
"expandlink expandlinked" : "expandlink"
} catch (i) {}
}
window.onload = function() {
expando()
};
这是JS小提琴
我从未见过JavaScript try…catch语句。我看了一些教程,它们都说是用于错误测试的。为什么会在这里使用
这看起来并不是真的有什么作用
注意:此代码已缩小。我使用了一个在线工具来取消整理它。这里的try..catch块用于错误处理。这里使用它来允许代码在出现错误时继续正常执行
并非所有浏览器都支持document.getElementsByClassName和document.querySelectorAll。在不支持这两个选项的浏览器上,我们会得到以下错误:
未捕获类型错误:document.querySelectorAll不是函数
…并且进一步的代码执行将停止
然而,对于这里的try..catch块,代码至少不会提醒我们错误,除非检查catch块中的o。执行将照常进行。它不再是一个未捕获的错误,而是一个与之无关的捕获错误
如果在同一浏览器中,我们要将上述代码调整为catch块中的log o:
上面显示的相同消息将显示在控制台上,没有未捕获部分:
TypeError:document.querySelectorAll不是函数
实际上,try-catch的实际用例很少 错误处理:您的JS函数/语句可能会抛出错误,如TypeError访问undefined、null、JsonParseError等。有时您需要对其进行处理,以便执行下一组语句。如果没有处理它,JS引擎将抛出它并停止函数执行。 从多个函数调用堆栈中获取有意义的完整信息:在遗留代码中,您可能会遇到这样的情况:函数f1调用f2,而f2调用f3,依此类推。您可能需要执行一些验证检查,如果验证失败,您可能希望停止流并显示有意义的完整错误消息。比如说,无效状态。为了处理这种情况,我们可以处理自定义异常 如果我们在函数f3中看到任何验证错误,比如抛出新的ValidationError“Rule is missing…”,我们可以抛出自定义错误
try {
...
} catch(e) {
if(e instanceof ValidationError) {
infoBox(e.message);
return false;
} else {
//This is not validation error, some other unknown issue has occurred
throw e;
}
}
我们将使用上面的块捕获函数f1中的异常,如果它是ValidationError类型,我们将显示正确的错误消息。如果它与任何其他类型相同,我们将返回以供将来调试之用
使用catch从预期的错误条件中恢复并忽略它们是一种常见的模式。关于使用try/catch是否代表一种好的实践,有很多意见,因此这样的讨论不太适合这样做。此外,您可能已经在研究中看到了MDN,但MDN是一个很好的参考:它看起来不像是您应该从中吸取任何教训的代码,至少不是像这样编写代码。它不用于错误测试。它用于错误捕获。上面的意思是,如果出了什么问题,就继续。例如,如果document.getElementByIdn因为元素不存在而返回null,那么r.className将失败;try/catch将拦截此消息。但是,我不推荐这种编程风格。除其他原因外,尽管我们通常不担心小的性能问题,但try/catch的速度是出了名的慢。而且,这种样式不会给出关于错误的警告或消息,只是默默地将其吞没。这是懒人捕捉错误的方法。在你的例子中,开发者看起来很懒惰。我想让它现在起作用,如果不起作用,就不要破坏页面正如其他人所指出的,这不是您想要学习的代码=/在我们的团队中,一个空的catch块永远不会通过代码审查,特别是当try块很大时。这是一种惰性编码,您应该了解代码可能出错的地方,并对问题采取实际行动,而不是忽略它们。忽略错误会使应用程序处于不稳定状态,并导致各种难以发现的错误。如果允许代码在错误发生时继续运行而不进行恢复,则很可能导致难以发现的错误。我知道你只是在解释发生了什么事,但免责声明已经准备好了。现在看来你在鼓励这种模式。
function ValidationError(message) {
this.name = "IocError";
this.message = (message || "Validation/System Error");
}
ValidationError.prototype = Error.prototype;
try {
...
} catch(e) {
if(e instanceof ValidationError) {
infoBox(e.message);
return false;
} else {
//This is not validation error, some other unknown issue has occurred
throw e;
}
}