Javascript 如何使函数执行try/check而不导致错误?
我有很多Javascript 如何使函数执行try/check而不导致错误?,javascript,error-handling,Javascript,Error Handling,我有很多try…catch语句用于实例,其中传入的JSON数据包可能在其他JSON可能没有数据的部分中。为此,我通常会执行以下操作: var numberofitems; try { numberofitems = payload.data.form_values["b691"].length; } catch (err) { numberofitems = 0; } 然而,在很多情况下,我可能会得到一个空值,这会使我以后的代码变得混乱。为了清理代码,我编写了一个函数,在一行中处理错误
try…catch
语句用于实例,其中传入的JSON数据包可能在其他JSON可能没有数据的部分中。为此,我通常会执行以下操作:
var numberofitems;
try {
numberofitems = payload.data.form_values["b691"].length;
} catch (err) { numberofitems = 0; }
然而,在很多情况下,我可能会得到一个空值,这会使我以后的代码变得混乱。为了清理代码,我编写了一个函数,在一行中处理错误:
函数checkTry(toCheck,errVal){
试一试{
var结果=toCheck;
}捕捉(错误){
结果=errVal;
}
返回结果;
}
函数datacheck(){
var数据;
var结果=校验(data.length,“0”);
控制台日志(结果);
}
数据检查()代码>解决方案
使用默认值并完全放弃try…catch
语句。异常实际上应该是一个异常,您不知道如何处理(至少try…catch
在简单的对象分解中没有位置):
var numberofitems=(payload.data.form_values.b691 | |[])长度代码>
var numberofitems=((payload.data.form_values | |{}).b691 | |[])长度代码>
var numberofitems=((payload.data | |{}).form| |{}).b691 | |[])。长度代码>
var numberofitems=(((有效载荷| |{}).data |{}).form|u值| |{}).b691 | |[])长度代码>
深入查看
该技术基于逻辑运算符的行为。对于逻辑AND,如果左侧为,则返回;如果左侧为,则返回右侧;如果左侧为,则返回右侧。对于逻辑OR运算符,则相反
由于undefined
和null
都是虚假的,而且对象总是真实的,因此我们可以安全地假设,如果给定了一个对象,逻辑OR将返回该对象,并且只有在一开始没有提供对象的情况下才返回到计算默认值
请注意,该技术仅限于始终真实/虚假的值。例如,就值
所包含的内容而言,以下内容是不确定的:
const不确定性测试=()=>{
const rand=Math.floor(Math.random()*3);
常量值=rand==1?
null:rand?true:false;
log(值| | `值为${value},我是一个回退字符串!`);
}
让timeoutId=null;
函数无限期运行(回调){
timeoutId=setTimeout(()=>{
回调();
无限期运行(回调);
},1e3);
}
const start=document.querySelector(#start”);
start.addEventListener(“单击”,()=>{
无限期运行(不确定性试验);
});
const end=document.querySelector(“#end”);
end.addEventListener(“单击”,()=>{
timeoutId&清除超时(timeoutId);
});代码>
开始
结束
所以,你不能这么做。如果你像一个编译器一样思考一秒钟,你就会意识到问题:每一条语句在使用前都需要求值,任何错误都需要立即处理。在checkTry调用中,您的语句执行如下:
评估有效载荷
评估有效载荷。数据
评估有效载荷。形成数值[“b691”]
评估有效载荷。表单_值[“b691”]。长度
(称为v1)
计算“0”(调用此v2)
调用checkTry(v1、v2)
将检查结果分配给numberofitems
如果在前3个步骤中没有出现任何内容,那么下一个步骤将抛出错误。问题是您的try/catch函数从未得到执行的机会,因此永远不会按您想要的方式工作
值得一提的是:我不确定挽救这个想法是否有意义。但是,您可以通过将其包装在函数中并将该函数传递给checktry
我想应该是这样的:
const risk=()=>{payload.data.form_值[“b691”].length}
校验(风险,“0”)
然后,CheckTry需要在try/catch中执行risk
函数。这应该是可行的,但是,这需要很多额外的努力,你需要反复重复一些事情。。。有点违背了这个目的,可能会给未来的开发人员增加一层复杂性。您应该尝试以下函数,我在AJAX问世时就写过这个函数,它可以与hastables中格式良好的命名空间层次结构一起工作(继续阅读)
在JavaScript中引入无缝猜测
确定命名空间/变量名是否存在。
在写入环境变量和对象之前,请检查它们是否存在命名空间
猜测“Book1.chapter22.paragraph37”是否存在且不会引发错误,如果存在,则使用最简单的表达式检索/发送数据:
调用语法:
isNS( [string], [num] )
例如:
var nsresult =
isNS( "Book1.chapter22.paragraph37", -1 );
if( nsresult[0] ){ send( nsresult[1] ) else notify( nsresult[4], nsresult[2] ) };
等等
//忽略修饰符或0、false和未定义以获取布尔值
isNS( "myObject.property.subProperty.myMethod" );
_> Boolean : true/false
修饰符可能值:
_> -1; (0|false|undefined); ( 1|true ); 2; 3 or 4.
说明:
(-1)\返回包含完全插入的数组对象
(0)可选;返回布尔值:true(如果存在完整的NS链):false(如果断开)
(1)\如果存在NS*查询,则大小写为true:返回现有值;如果不存在,则case false:如果存在,则返回最后一个有效上下文;如果根不存在,则返回全局对象
(2)\返回参数查询中现有名称空间的数组
(3)\返回包含所有指定名称空间的数组
(4)\返回原始查询字符串
function isNS(arg,f) { /*b.b. Troy III p.a.e.*/
var i, a = arg.split("."), c = this, s = [], b, r;
f = f || 0;
for( i in a ) {
c ? a[i] in c ? ( c = c[ a[i] ], s.push( a[i] ), b = !0 ) : b = !1 : 0;
}
r = [ b, c, s, a, arg ];
return f < 0 ? r : r[+f||f]
}
函数isNS(arg,f){/*b.b.特洛伊III p.a.e*/
变量i,a=arg.split(“.”),c=this,s=[],b,r;
f=f | | 0;
为了(我在a){
c?a[i]在c?(c=c[a[i]],s.push(a[i]),b=!0:b=!1:0;
}
r=[b,c,s,a,arg];
返回f<0?r:r[+f | | f]
}
*NS-表示已经熟悉的“名称空间”首字母。
[这在某些情况下只是一个微小的集群