这是try / catch块的正确用法吗?

时间:2014-04-10 18:33:12

标签: javascript try-catch

我尝试使用decodeURIComponent()解码可能是单个或双百分比编码的网址。因为我不想在尝试解码只包含"URI malformed"(5)的字符串时获得%25,所以我使用此try/catch块。我是否正确使用了try/catch块?它似乎有效,但我试图了解这是一种最佳实践方法,还是我过度复杂的事情。

var uriCleanup = function (str) {

    var cln = function (str) {

        try {

            str = decodeURIComponent(str);
            //try to decode the URI again
            return cln(str);

        } catch (e) {
           //if error thrown, URI contains single percent symbol
           //return the str as it was the last time it was decoded
           return str;

        }

    };

    return cln(str);

};

JSBIN

2 个答案:

答案 0 :(得分:2)

你做的事情过于复杂:这里不需要使用递归。

function uriCleanup(str) {
    var cln = str;
    try {
        do {
            cln = decodeURIComponent(str);
        } while (cln !== str && (str = cln));
    }
    catch (e) {}
    return cln;
}

答案 1 :(得分:1)

这不是最佳做法。 try/catch您应该使用,并且仅使用它来处理中断代码流并破坏您完成代码的能力的异常情况。如果你更普遍地使用它,最终会得到一个非常强大的goto类结构,在你的代码中使用起来很笨重。

与if,else,while等相比,try / catch是一个更难学习的结构,因为只有你在具有模块化库函数的大型代码库中工作才真正有意义。

一个简单的例子可能是函数

var saveOrder = function(order) {
    if(!order.confirmed) {
        throw new Error("Please confirm you order.");
    }
    saveToMySQL(order);
};

//... somewhere else

try { 
    order = getOrderFromUser();
    saveOrder(userOrder);
    alert("Thank you for your order, continue shopping?");
}
catch(err) {
    alert(err);
}

这里的要点是

  • saveOrder因为无法继续
  • 而抛出
  • try / catch仅被认为可以处理异常的方法使用
  • 如果没有异常发生,代码线性且干净地读取,并且以下行永远不必担心上一行是否成功