2008-09-26 18 views
6

在JavaScript中使用try-catch块并忽略错误而不是测试块中的许多属性为null是错误的?是一个JavaScript尝试捕获忽略预期偶尔错误的不良做法吗?

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 

回答

-1

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

+0

仅适用于强类型语言。不是JavaScript。 – roosteronacid 2008-09-27 11:18:22

1

我会认为,如果你要捕捉异常,然后做一些事情。否则,让它冒泡,让更高级别的人可以以某种方式处理它(即使只是浏览器向你报告错误)。

2

是的。首先,除了缺少参数之外,还有其他原因可能会引发异常。捕获所有可能会隐藏那些可能不需要的情况。

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()?如果是这样,你需要改变这个逻辑!

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