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;
    }
}