7

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

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
4

6 回答 6

4

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

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() ?如果是这样,您将需要更改该逻辑!

于 2008-09-26T19:39:40.473 回答
2

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

于 2008-09-26T19:38:24.233 回答
1

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

于 2008-09-26T19:38:05.763 回答
1

在相关说明中,在 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();
}
于 2008-09-26T19:47:41.047 回答
0

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

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);
}
于 2008-09-26T21:48:11.677 回答
-1

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

于 2008-09-26T19:37:41.240 回答