使用围绕对象文字的try catch

在callback中,我构build了一个对象,用于构build快速应用程序:

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但这似乎是错误的。

什么被认为是处理这个问题的好方法?

1.使用try / catch

在你的声明中你有:

  • 26个引用错误的潜在源(16个缺失对象,10个数组越界)。

这就是try / catch最好的处理方式。 从一个代码块处理相同types的错误,并在一个地方处理。 所以除非你想单独处理每个潜在的错误,否则try / catch是你最好的工具。 它的工作,你可以找出问题:

 var w = {} try {wxyz} catch(e) {e} 

TypeError:无法读取undefined(…)的属性'y'

另外,如果你需要更多的控制,你可以

2.预先testing所有参考文献

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

 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如何searchXML树,所以我build议使用类似JSONPath的东西来search数据结构中的嵌套对象。 例如

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

然而,这里有很多选项(例如评论中提到的lodash /下划线)。

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

是一个很好的解决scheme,取决于你想成为多么细微

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

javascript:这是一个有条件的任务吗? 。

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

当然,你必须确保处理这个问题的东西不会因为同样的原因而被炸毁。

编辑:上述不工作,虽然我认为这是一个JavaScript的function。 如果你不能工作,你可以用三元操作符完成同样的事情

 var asdf = (jkl == undefined) ? 3 : jkl; 

哪个说

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

这个麻烦就是如果你这样做

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

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

我听说(并同意)嵌套的三元语句不是一个好主意。

另一个编辑:检查这里如何确定variables是'undefined'还是'null'? 对于可能或可能没有定义的variables的问题。 显然, == undefined== null只在variables声明但没有定义时才起作用。 其实,我认为你是这样的。 如果有疑问,请使用typeof