【问题标题】:Is a JavaScript try-catch ignoring an expected occasional error bad practice?JavaScript try-catch 是否忽略预期的偶尔错误是不好的做法?
【发布时间】:2010-09-13 13:49:17
【问题描述】:

在 JavaScript 中使用 try-catch 块并忽略错误而不是测试块中的许多属性是否为空是错误的吗?

try{ 
   if(myInfo.person.name == newInfo.person.name
      && myInfo.person.address.street == newInfo.person.address.street
      && myInfo.person.address.zip == newInfo.person.address.zip) {
         this.setAddress(newInfo);
    } 
} catch(e) {} // ignore missing args

【问题讨论】:

    标签: javascript try-catch


    【解决方案1】:

    如果您期望某个特定条件,那么如果您明确地测试它,您的代码将更容易维护。我会把上面写成类似

    if(   myInfo && newInfo 
          && myInfo.person && newInfo.person
          && myInfo.person.address && newInfo.person.address
          && ( myInfo.person.name == newInfo.person.name
               && myInfo.person.address.street == newInfo.person.address.street
               && myInfo.person.address.zip == newInfo.person.address.zip
             )
    ) 
    {
         this.setAddress(newInfo);
    } 
    

    这使得效果更加清晰 - 例如,假设 newInfo 全部填写,但部分 myInfo 丢失?也许您实际上希望在这种情况下调用 setAddress() ?如果是这样,你需要改变这个逻辑!

    【讨论】:

      【解决方案2】:

      是的。一方面,除了缺少参数之外,还可能由于多种原因引发异常。包罗万象将隐藏那些可能不需要的情况。

      【讨论】:

        【解决方案3】:

        我认为,如果您要捕获异常,请对其进行处理。否则,让它冒泡,以便更高级别可以以某种方式处理它(即使只是浏览器向您报告错误)。

        【讨论】:

          【解决方案4】:

          在相关说明中,在 IE 中,即使规范说可以,但不能使用 try/finally 组合。为了让你的“finally”执行,你必须定义一个 catch 块,即使它是空的。

          //this will [NOT] do the reset in Internet Explorer
          try{
            doErrorProneAction();
          } finally {
            //clean up
            this.reset();
          }
          
          //this [WILL] do the reset in Internet Explorer
          try{
            doErrorProneAction();
          } catch(ex){
            //do nothing
          } finally {
            //clean up
            this.reset();
          }
          

          【讨论】:

            【解决方案5】:

            您总是可以编写一个辅助函数来为您进行检查:

            function pathEquals(obj1, obj2, path)
            {
                var properties = path.split(".");
                for (var i = 0, l = properties.length; i < l; i++)
                {
                    var property = properties[i];
                    if (obj1 === null || typeof obj1[property] == "undefined" ||
                        obj2 === null || typeof obj2[property] == "undefined")
                    {
                        return false;
                    }
            
                    obj1 = obj1[property];
                    obj2 = obj2[property];
                }
            
                return (obj1 === obj2);
            }
            
            if (pathEquals(myInfo, newInfo, "person.name") &&
                pathEquals(myInfo, newInfo, "person.address.street") &&
                pathEquals(myInfo, newInfo, "person.address.zip"))
            {
                this.setAddress(newInfo);
            }
            

            【讨论】:

              【解决方案6】:

              对于给出的示例,我会说这是不好的做法。然而,在某些情况下,简单地捕获预期错误可能会更有效。在casting it as a GUID 之前验证字符串的格式就是一个很好的例子。

              【讨论】:

              • 仅适用于强类型语言。不是 JavaScript。
              猜你喜欢
              • 2021-11-13
              • 2012-05-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-01
              • 2016-04-13
              • 2011-02-04
              • 1970-01-01
              相关资源
              最近更新 更多