2008-09-26 35 views
6

在JavaScript中使用try-catch塊並忽略錯誤而不是測試塊中的許多屬性爲null是錯誤的?是一個JavaScript嘗試捕獲忽略預期偶爾錯誤的不良做法嗎?

try{ 
    if(myInfo.person.name == newInfo.person.name 
     && myInfo.person.address.street == newInfo.person.address.street 
     && myInfo.person.address.zip == newInfo.person.address.zip) { 
     this.setAddress(newInfo); 
    } 
} catch(e) {} // ignore missing args 

回答

-1

對於給出的例子,我會說這是不好的做法。然而在某些情況下,它可能更有效有效只是陷阱爲預期錯誤。驗證casting it as a GUID之前的字符串格式將是一個很好的例子。

+0

僅適用於強類型語言。不是JavaScript。 – roosteronacid 2008-09-27 11:18:22

1

我會認爲,如果你要捕捉異常,然後做一些事情。否則,讓它冒泡,讓更高級別的人可以以某種方式處理它(即使只是瀏覽器向你報告錯誤)。

2

是的。首先,除了缺少參數之外,還有其他原因可能會引發異常。捕獲所有可能會隱藏那些可能不需要的情況。

4

如果您期望某個特定條件,那麼如果明確地測試它,代碼將更容易維護。我會寫在上面,就像這樣

if( myInfo && newInfo 
     && myInfo.person && newInfo.person 
     && myInfo.person.address && newInfo.person.address 
     && (myInfo.person.name == newInfo.person.name 
      && myInfo.person.address.street == newInfo.person.address.street 
      && myInfo.person.address.zip == newInfo.person.address.zip 
     ) 
) 
{ 
    this.setAddress(newInfo); 
} 

這使得更清晰的效果 - 例如,假設newInfo被全部填寫,但MyInfo功能的部分丟失?也許你真的想在這種情況下調用setAddress()?如果是這樣,你需要改變這個邏輯!

1

在相關說明中,在IE中,儘管規格說明可以,但不能使用try/finally組合。爲了讓你的「finally」執行,你必須定義一個catch塊,即使它是空的。

//this will [NOT] do the reset in Internet Explorer 
try{ 
    doErrorProneAction(); 
} finally { 
    //clean up 
    this.reset(); 
} 

//this [WILL] do the reset in Internet Explorer 
try{ 
    doErrorProneAction(); 
} catch(ex){ 
    //do nothing 
} finally { 
    //clean up 
    this.reset(); 
} 
0

你總是可以寫一個輔助函數來做檢查你:

function pathEquals(obj1, obj2, path) 
{ 
    var properties = path.split("."); 
    for (var i = 0, l = properties.length; i < l; i++) 
    { 
     var property = properties[i]; 
     if (obj1 === null || typeof obj1[property] == "undefined" || 
      obj2 === null || typeof obj2[property] == "undefined") 
     { 
      return false; 
     } 

     obj1 = obj1[property]; 
     obj2 = obj2[property]; 
    } 

    return (obj1 === obj2); 
} 

if (pathEquals(myInfo, newInfo, "person.name") && 
    pathEquals(myInfo, newInfo, "person.address.street") && 
    pathEquals(myInfo, newInfo, "person.address.zip")) 
{ 
    this.setAddress(newInfo); 
}