Duck用JSON对象打字-try/except
Duck Typing with JSON object - try/except?
在AngularJS中,我有一个api请求,它发出并返回一个JSON。JSON存储为对象data
,我使用data.Automation.Status
检查Status
中的字符串。
有一些JSON错误可能会增加(在http 200成功并成功返回JSON之后):
- 整个JSON可以返回一个空白字符串"
- 数据JSON对象可能存在,但Automation JSON对象可能未定义
- 对象
Automation
的属性Status
可能未定义或为空字符串
来自python,所有这些可能的情况都可以在try/except块中轻松处理。
Try:
do something with JSON
except (blah, blah)
don't error out because JSON object is broken, but do this instead
我看到angular有$errorHandler服务,可以使用自定义处理程序进行修改。但我不确定这是否可以像我正在寻找的鸭子打字一样使用。
我如何在AngularJS中进行鸭子打字?具体来说,对于上面列表中提到的JSON对象错误场景?
我目前如何使用data.Automation.Status
:
if (iteration < Configuration.CHECK_ITERATIONS && data.Automation.Status !== "FAILED") {
iteration++;
return $timeout((function() {
return newStatusEvent(eventId, url, deferred, iteration);
}), Configuration.TIME_ITERATION);
} else {
err = data.Automation.StatusDescription;
return deferred.reject(err);
}
以下是我如何找到相同问题的解决方案
它使它保持最小,并且所有测试都分组在一个块中。
$http.get('/endpoint1').success(function(res) {
try {
// test response before proceeding
if (JSON.stringify(res).length === 0) throw 'Empty JSON Response!';
if (!res.hasOwnProperty('Automation')) throw 'Automation object is undefined!';
if (!res.Automation.hasOwnProperty('Status') || res.Automation.Status !== 'SUCCESS')
throw 'Automation Status Failed!';
} catch (err) {
// handle your error here
console.error('Error in response from endpoint1: ' + err);
}
// if your assertions are correct you can continue your program
});
处理这种情况的最佳方法是使用$parse,因为它可以很好地处理未定义的情况。你可以这样做:
$http.get('/endpoint1').success(function(res) {
try {
// test response before proceeding
if (angular.isUndefined($parse('Automation.Status')(res))) {
throw 'Automation Status Failed!';
}
} catch (err) {
// handle your error here
console.error('Error in response from endpoint1: ' + err);
}
// if your assertions are correct you can continue your program
});
您可以在这个plunker中看到$parse如何处理您的场景。
取决于您想要获得的复杂程度。如果你想用咖啡脚本,有一个不错的?operator:json.knownToExist.maybeExists?.maybeAlsoExists?()
永远不会出错,并且只会在存在的情况下调用maybeAlsoExists。
否则,您可以使用支票类型:
foo = {a: 1, b: 2}
typeof foo === 'object'
typeof foo.bar === 'undefined'
我的印象是javascript中的try/catch块相对昂贵。因此,您可能需要手动测试json,特别是如果服务的不同返回值是您所称的"正常"响应。例外情况IMO应用于异常事件,而不是健全性检查。
相关文章:
- errors with Javascript try catch
- JSON.parse,已经在try/catch块中,仍然抛出语法错误
- 错误处理try&catch+回调
- 在try-catch块内的HTML文件中导入JavaScript文件
- 如果总是执行finally,为什么try会返回未更改的值
- 为什么这个生成器会跳过 try 块之外的收益
- 有没有一种方法可以将try-catch添加到Javascript中的每个函数中
- try声明变量的作用域
- Javascript Try Catch for DIV
- 如何替换//中的/except
- Safari 在尝试使用 Javascript try/catch 访问父窗口对象时未捕获异常
- 与在异步回调链中使用 try catch 块相比,返回异常有什么优势
- 在 Javascript 中,即使从未抛出异常,使用 try-catch 块是否昂贵
- JavaScript 中的 try-catch:如何获取原始错误的堆栈跟踪或行号
- 使用 try catch(e) 进行浏览器功能检测
- 了解 JavaScript 中的异常处理:当更改 try/catch 块的位置时,获得不同的输出
- 在 JavaScript 中用“try catch”包装每个方法的性能问题
- execScript try/catch in IE 8 中的怪异之处
- Duck用JSON对象打字-try/except
- 在JavaScript中是否有与Python's "try ..except"特性