我有一些代碼,看起來像以下:如果我對「無法讀取屬性'****'未定義'會怎麼樣?
$scope.query.toLowerCase() != 1
如果沒有定義的查詢 - 有在控制檯中的錯誤。實際上,代碼仍然會產生我想要的結果,但處理錯誤的正確方法是什麼?當然,我可以預先檢查這個變量 - 但是這會導致更多的代碼,而不必確定通過閱讀更多代碼來隱藏錯誤的好處。
我有一些代碼,看起來像以下:如果我對「無法讀取屬性'****'未定義'會怎麼樣?
$scope.query.toLowerCase() != 1
如果沒有定義的查詢 - 有在控制檯中的錯誤。實際上,代碼仍然會產生我想要的結果,但處理錯誤的正確方法是什麼?當然,我可以預先檢查這個變量 - 但是這會導致更多的代碼,而不必確定通過閱讀更多代碼來隱藏錯誤的好處。
當然,我可以請預先檢查變量 - 但是,這將導致更多的代碼
編寫更多的代碼,不會使你的代碼不好,除非你是在一個代碼高爾夫比賽。如果你不處理你的錯誤和邊緣情況,那麼你的程序將不可靠。如果一行代碼引發錯誤,您的代碼甚至可能過早終止。
另一種處理可能的未定義屬性的方法是定義一個默認值,而不是檢查它是否爲undefined
。
($scope.query || "").toLowerCase() != 1 // this is enough to fix your expression
或更正式
($scope.query === undefined ? "" : $scope.query).toLowerCase() != 1
顯然,這取決於你的目的是什麼。
又如:
function add(a, b){
return a + (b || 0); // if b is falsy, assume b is 0
}
add(1, 2); // 3
add(1); // 1
Shortcircuiting在某些情況下非常有用,但要確保你知道它是如何工作的,因爲濫用會造成意想不到的行爲。
它不好的做法,做...
try {
$scope.query.toLowerCase() != 1
} catch(e) {
// do nothing
}
,因爲這掩蓋了錯誤,並意外的錯誤發生,你不會知道這件事情,這使得調試一場噩夢。
批准的做法是編寫一些額外的防線代碼行以防止會導致錯誤的情況。 是的它更詳細,但它比代碼庫這是一個噩夢調試好。
:我outsorcing這個任務變成一個小幫手:
function string(v){ return v==null? "": String(v) }
,我可以肯定,該輸出始終是一個字符串(類型安全)。
string($scope.query).toLowerCase() != 1
在這種特殊情況下?要檢查對一個號碼,你不需要toLowerCase()
+$scope.query !== 1
甚至會更好,在這種情況下,不需要處理null或undefined。
[檢測未定義的對象屬性]的可能的重複(http://stackoverflow.com/questions/27509/detecting-an-undefined-object-property) – Hacketo
@Hacketo似乎不像我重複。 –
你應該檢查它,並拋出自己的錯誤,然後處理程序中的錯誤,特別是如果查詢被定義是用戶提供正確輸入的直接後果。如果這種情況不會發生在任何類型的用戶輸入上,那就讓它失敗。 – Neil