在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
答案 0 :(得分: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 :(得分:2)
是。首先,除了缺少参数之外,还可能出于多种原因抛出异常。所有人都会隐藏那些可能不合需要的案例。
答案 2 :(得分:1)
我认为如果你要抓住异常,那么就用它做点什么。否则,让它冒泡,以便更高级别可以以某种方式处理它(即使只是浏览器向您报告错误)。
答案 3 :(得分: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();
}
答案 4 :(得分: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);
}
答案 5 :(得分:-1)
对于给出的例子,我会说这是不好的做法。然而,有些情况可能会更加高效来简单地捕获预期的错误。在casting it as a GUID之前验证字符串的格式就是一个很好的例子。