JavaScript尝试捕获是否忽略了预期的偶发错误?
在JavaScript中,使用try-catch块忽略错误而不是测试块中的许多属性是否为null是错误的JavaScript尝试捕获是否忽略了预期的偶发错误?,javascript,try-catch,Javascript,Try Catch,在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.add
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
举个例子,我会说这是一个坏习惯。然而,在某些情况下,简单地捕捉预期的错误可能更有效。之前验证字符串的格式就是一个很好的例子。我认为如果要捕获异常,请对其进行处理。否则,让它冒泡起来,以便更高级别可以以某种方式处理它(即使只是浏览器向您报告错误)。是。首先,除了缺少参数外,还可以出于多种原因引发异常。“一网打尽”将隐藏那些可能不需要的情况。如果您期望某个特定条件,那么如果您明确测试它,代码将更易于维护。我会像这样写上面的内容
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组合。为了执行“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);
}
功能路径等于(obj1、obj2、路径)
{
变量属性=路径分割(“.”);
对于(变量i=0,l=properties.length;i
仅适用于强类型语言。不是JavaScript。