我在JavaScript中使用这种代码。
if(typeof a[x] != "undefined" && typeof a[x][y] != "undefined" && typeof a[x][y][z] != "undefined") {
a[x][y][z].update();
}
// else do nothing
我只是认为使用try catch来实现上述逻辑会简化代码并减少每次检查三个条件。 (见下文)
try {
a[x][y][z].update();
} catch(e) {
}
在这种情况下使用try catch是否合适?
注意:如果您想知道为什么我要检查这三个条件:a [] [] []包含对象的引用,动态添加引用。
答案 0 :(得分:2)
可读性更重要,除非你处于极其性能优化的循环或功能中,否则它应该没有什么区别。
正如PleaseStand所述,将整个事物包裹在try/catch
中将隐藏任何错误。如果你还想try/catch
var fn = null;
try {
fn = a[x][y][z].update;
} catch (e) {
fn = function(){}
}
fn();
或
var fn = null;
try {
fn = a[x][y][z].update;
} catch (e) {}
fn && fn();
答案 1 :(得分:1)
.update()
方法抛出的任何异常都会被忽略,可能会隐藏错误。请注意,在原始示例中,您不必使用typeof
:
if(a[x] !== undefined && a[x][y] !== undefined && a[x][y][z] !== undefined) {
a[x][y][z].update();
}
答案 2 :(得分:1)
在这种情况下使用try catch是否合适?
不,因为它会捕获并丢弃任何其他错误,而不是您期望的错误,使调试更加困难。不幸的是,JavaScript的异常处理相当薄弱,并且您无法仅捕获某些异常。相反,你必须抓住一切,故意嗅到你想要的东西,并重新抛出其余的东西:
try {
a[x][y][z].update();
} catch(e) {
if (!(e instanceof TypeError))
throw e;
}
这不是很清楚,并且仍然会捕获很多其他潜在错误,因为JavaScript的内置异常(例如TypeError
)非常广泛。
除了使用更明确的in
运算符而不是笨重的typeof
测试外,我会选择原始解决方案:
if (x in a && y in a[x] && z in a[x][y])
a[x][y][z].update();
答案 3 :(得分:0)
为什么显式检查undefined?
if(a[x] && a[x][y] && a[x][y][z]) {
a[x][y][z].update();
}
答案 4 :(得分:0)
在处理 falsy 值时,Javascript非常容错,你可以这样做:
var v =
(a ? (a[x]
? (a[x][y]
? (a[x][y][z]
? a[x][y][z] : null)
: null)
: null)
: null);
if (v) v.update();