2011-06-02 108 views
2

我在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

的'try'方法也會'catch'當有其他錯誤,所以我不會不會使用它。 – pimvdb 2011-06-02 21:08:20

+0

@pimvdb:???你還有什麼其他的錯誤? – KooiInc 2011-06-02 21:15:15

+0

@Kooilnc:就像'.update()'函數中發生的錯誤一樣。我不知道那個函數實際上在做什麼,但是'try/catch'可以抑制在那行代碼或其他函數中出現的* all *錯誤。 – pimvdb 2011-06-02 21:17:48

回答

2

可讀性問題更重要,除非您處於極其性能優化的循環或功能中,否則不應有所作爲。

如您所述,將整個東西包裝在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

.update()方法拋出的任何異常都被默默忽略,可能隱藏了錯誤。請注意,在您的原始示例中,您不必使用typeof

if(a[x] !== undefined && a[x][y] !== undefined && a[x][y][z] !== undefined) { 
    a[x][y][z].update(); 
} 
+1

+1請注意,雖然'undefined'可以設置爲其他值,所以'typeof'更可靠。 – pimvdb 2011-06-02 21:09:15

+0

哦,我不知道這個。對於正常變量!== undefined不起作用,但對數組起作用。爲什麼這樣? – Cracker 2011-06-02 21:20:40

+0

@pimvdb我不明白你的意思是將undefined設置爲其他值。 undefined = 123 ??? – Cracker 2011-06-02 21:23:11

0

爲什麼顯式檢查未定義?

if(a[x] && a[x][y] && a[x][y][z]) { 
    a[x][y][z].update(); 
} 
+1

也許其他的falsy值是可以接受的輸入嗎? – Cronco 2011-06-02 21:12:17

+0

@Cronco。我沒有看到在哪些情況下中間值是虛假的,但[x] [y] [z] .update()是可運行的。任何例子? – tokland 2011-06-02 21:14:20

+0

現在我想不出任何例子,但是當然,計算某些事情可能需要0作爲輸入。 – Cronco 2011-06-02 21:21:33

0

JavaScript是相當錯誤tollerant,當涉及到處理falsy值,你可以這樣做:

var v = 
    (a ? (a[x] 
      ? (a[x][y] 
       ? (a[x][y][z] 
        ? a[x][y][z] : null) 
       : null) 
      : null) 
    : null); 

if (v) v.update(); 
1

是不是很好用嘗試捕捉在這樣的情況?

不,因爲它會捕獲並丟棄除您期望的錯誤之外的任何其他錯誤,從而使調試更加困難。不幸的是,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(); 
相關問題