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

Javascript 这是try/catch块的正确用法吗,javascript,try-catch,Javascript,Try Catch,我正在尝试使用decodeURIComponent()对可能是单百分比或双百分比编码的URL进行解码。因为我不想在尝试解码只包含%25(5)的字符串时得到“URI格式错误”,所以我使用了这个try/catch块。我是否正确使用了try/catch块?这似乎是可行的,但我试图了解这是否是一种最佳实践方法,或者我是否有过复杂的事情 var uriCleanup = function (str) { var cln = function (str) { try {

我正在尝试使用
decodeURIComponent()
对可能是单百分比或双百分比编码的URL进行解码。因为我不想在尝试解码只包含
%25
(5)的字符串时得到
“URI格式错误”
,所以我使用了这个
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);

};

您会使事情过于复杂:这里不需要使用递归

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

您确实使事情过于复杂:这里不需要使用递归

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

您确实使事情过于复杂:这里不需要使用递归

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

您确实使事情过于复杂:这里不需要使用递归

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

这不是最好的做法
try/catch
您应该使用,并且只能使用,来处理中断代码流并破坏您完成代码的能力的异常情况。如果您更广泛地使用它,您将得到一个非常强大的
goto
-样的结构,在代码中使用起来非常笨拙

与if、else、while等相比,try/catch是一种更难学习的结构,因为只有在使用模块化库函数的大型代码库中工作时,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仅由认为可以处理异常的方法使用
  • 如果没有发生异常,代码将以线性和干净的方式读取,下一行永远不必担心前一行是否成功

    • 这不是最佳做法
      try/catch
      您应该使用,并且只能使用,来处理中断代码流并破坏您完成代码的能力的异常情况。如果您更广泛地使用它,您将得到一个非常强大的
      goto
      -样的结构,在代码中使用起来非常笨拙

      与if、else、while等相比,try/catch是一种更难学习的结构,因为只有在使用模块化库函数的大型代码库中工作时,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仅由认为可以处理异常的方法使用
      • 如果没有发生异常,代码将以线性和干净的方式读取,下一行永远不必担心前一行是否成功

        • 这不是最佳做法
          try/catch
          您应该使用,并且只能使用,来处理中断代码流并破坏您完成代码的能力的异常情况。如果您更广泛地使用它,您将得到一个非常强大的
          goto
          -样的结构,在代码中使用起来非常笨拙

          与if、else、while等相比,try/catch是一种更难学习的结构,因为只有在使用模块化库函数的大型代码库中工作时,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仅由认为可以处理异常的方法使用
          • 如果没有发生异常,代码将以线性和干净的方式读取,下一行永远不必担心前一行是否成功

            • 这不是最佳做法
              try/catch
              您应该使用,并且只能使用,来处理中断代码流并破坏您完成代码的能力的异常情况。如果您更广泛地使用它,您将得到一个非常强大的
              goto
              -样的结构,在代码中使用起来非常笨拙

              与if、else、while等相比,try/catch是一种更难学习的结构,因为只有在使用模块化库函数的大型代码库中工作时,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仅由认为可以处理异常的方法使用
              • 如果没有发生异常,代码将以线性和干净的方式读取,下一行永远不必担心前一行是否成功


              谢谢。我注意到您没有删除try/catch块。你认为这可以吗,或者有没有一种方法可以不做,特别是因为catch语句中没有做任何事情;防止这种讨厌的错误的所有其他方法:格式错误的URI序列更糟糕。但是在您的原始代码中,
              cln
              的每个后续调用都创建了它们自己的try-catch作用域,这是不好的(因为它不是真正需要的)<代码>cln!==str&(str=cln)@thomas First,
              cln
              (解码结果)与原始字符串(存储在
              str
              中)进行比较。如果它们是相同的,没有进一步的解码改变任何东西,因此循环中断。如果不是,解码结果将存储在
              str
              值中,循环将继续处理。谢谢,现在已经清楚了。因此,在JavaScript评估中,可以在
              &&
              之后包含变量赋值?我知道for循环当然包含了这种声明(var i=0,len=myArray.length;iThanks。我注意到您没有删除try/catch块。您认为这样可以吗,或者有没有办法不删除它,特别是因为catch语句中没有任何操作。当然,在这种特殊情况下,这是可以的;所有其他防止讨厌的
              URIError的方法:格式错误的URI序列
              都是更糟的是一英里。但是在您的原始代码中,
              cln的每个后续调用<