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-表示已经熟悉的“名称空间”首字母。 [这在某些情况下只是一个微小的集群