JavaScript try-catch是否忽略预期的偶然错误错误做法?
时间:2020-03-06 14:48:10 来源:igfitidea点击:
在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
解决方案
对于给出的示例,我会说这是不好的做法。但是,在某些情况下,简单地捕获预期的错误可能会更有效。在将字符串转换为GUID之前验证字符串的格式将是一个很好的示例。
我认为,如果我们要捕获异常,请对其进行处理。否则,让它冒出气泡,以便更高级别可以某种方式处理它(即使只是浏览器向我们报告错误)。
是的。一方面,除了缺少参数外,还可能由于多种原因引发异常。包罗万象将隐藏那些可能不希望的情况。
如果我们期望某个特定条件,则如果我们明确测试它,则代码将更易于维护。我将上面的内容写成
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()?如果是这样,则需要更改该逻辑!
值得一提的是,在IE中,即使规格说明可以,也不能使用try / 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();
}
我们总是可以编写一个辅助函数来为我们做检查:
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);
}

