使用try catch对象文字

时间:2016-04-20 19:22:27

标签: javascript node.js express

在回调中,我构建了一个我构建的对象,用于在我的Express应用程序中发送:

this.response = {
      owner: data.actions[1].causes[0].shortDescription,
      build_version: data.actions[0].parameters[0].value,
      branch_to_merge: data.actions[0].parameters[1].value,
      jira_tickets: data.actions[0].parameters[2].value,
      build_description: data.actions[0].parameters[3].value,
      outcome: data.result
    };

如果我得到的响应与我以前的响应不同,我会收到导致我的服务器崩溃的致命cannot find 'property' of undefined错误:data.actions[1].causes[0].shortDescription

我想知道该怎么办,我想我可以把它放在try catch中,但这似乎不对。

什么被认为是解决这个问题的好方法?

2 个答案:

答案 0 :(得分:2)

1。使用try / catch

在你的陈述中,你有:

  • 参考错误的26个潜在来源(16个缺失对象,10个数组超出界限)。

这就是try / catch处理得最好的。从一个代码块中处理相同类型的错误并在一个地方处理。因此,除非您想单独处理每个潜在错误,否则尝试/ catch是您可以使用的最简单,最好的工具。它有效并且您可以查明问题:

var w = {}
try {w.x.y.z} catch(e) {e}
  

TypeError:无法读取属性' y'未定义的(...)

或者,如果您需要更多控制权,可以

2。预先测试所有参考

如果即使某些属性失败也必须成功,您可以检查每个引用。 e.g:

var sdValid = data && 
            data.actions && 
            data.actions.length>1 && 
            data.actions[0].causes && 
            data.actions[0].causes.length && 
            data.actions[1].causes[0].shortDescription;
var owner = sdValid
            ?  data.actions[1].causes[0].shortDescription 
            : 'default value';
this.response = {
    owner : owner,
    // etc... 
}

如果你

,你可以轻松使其更具可读性

3。推出自己的参考检查器

this.response = {
    owner : nestget(data, 'nobody')
               .prop('actions', 1)
               .prop('causes', 0)
               .prop('shortDescription')
               .value(), 
               // return shortDescription if you got this far or 'nobody'

    build_version : nestget(data, '0.0.0')
               .prop('actions', 0)
               .prop('parameters', 0)
               .prop('value')
               .value(),
               // return value if you got this far or '0.0.0'
    // ... etc
};

// Custom - easy to use reference checker
function nestget (obj, default) {
   var valid = false;
   this.default = default;
   this.obj = obj;
   var that = this;

   return { 
       prop : propChecker,
       value : getValue
   }

   function propChecker (prop, i) {
      // implementation omitted for brevity
   }
   function getValue () {
      return value;
   }
}

4。使用库

最后但并非最不重要的是,您始终可以使用库。我个人喜欢XPath搜索XML树,所以我建议使用JSONPath之类的东西来搜索数据结构中的嵌套对象。 e.g。

this.response = {
    owner : jsonpath(data, '$..shortDescription[0]'),
    build_version jsonpath(data, '$.actions[0].parameters[0].value'), // no error
    // ... etc
}

但是,有很多选项(例如评论中提到的lodash / underscore)。

答案 1 :(得分:0)

try {
    //unwrap your data
}
catch(err) {
    //handle the failure
}

是一个很好的解决方案,取决于你想要的细微差别

如果您想继续执行,即使一个或多个失败,您也可以考虑条件赋值运算符

javascript: is this a conditional assignment?

this.response = {
      owner: data.actions[1].causes[0].shortDescription || undefined,
      etc: data.something || undefined
    };

当然,你必须确保处理this.response上游的东西不会因为同样的原因而爆炸。

编辑:以上不适合我,虽然我认为这是javascript的一个功能。如果你不能使它工作,你可以用三元运算符

完成同样的事情
var asdf = (jkl == undefined) ? 3 : jkl;

其中说

if(asdf == undefined) asdf = 3; else asdf = jkl 

问题在于,如果你这样做

var asdf = (nested.variable == undefined) ? 3 : nested.variable;

如果nestedundefined,您的代码就会中断。有一些解决方法,例如设置一些标志然后调整三元组。

我已经听到(并同意)嵌套的三元陈述不是一个好主意。

另一个编辑: 请查看此处How to determine if variable is 'undefined' or 'null'?,了解有关可能定义或未定义的变量的问题。 显然== undefined== null仅在声明变量但未定义变量时才起作用。 实际上,我认为这就是你的情况。如有疑问,请使用typeof