在这种情况下使用异常处理是否合适?

时间:2011-06-02 20:58:16

标签: javascript exception-handling

我在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 [] [] []包含对象的引用,动态添加引用。

5 个答案:

答案 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();
相关问题