如果發生錯誤並且功能無法繼續前進,那麼在JavaScript中報告錯誤而不是依賴於空值,以及未定義什麼是一種好方法。我能想到的三種方法:指示故障的JavaScript反靜音技術
- 無能爲力
- 拋出一個異常
- 斷言
下面是一個簡單的示例場景 - 這歸功於在通過量的用戶帳戶的功能。函數credit
是Account
對象的一部分。
這是天真的解決方案。
function credit(amount) {
this.balance += amount;
}
這種方法的一個主要問題是無效的數據。讓我們來修復它,並使用返回值來指示操作失敗。
function credit(amount) {
if(!isInt(amount)) {
return false;
}
this.balance += amount;
}
這是對上一個的改進,但客戶端代碼將不得不檢查返回值以確保操作成功。基本上,系統中的每種方法都會變得麻煩。
if(!johnDoe.credit(100)) {
// do some error handling here
}
第三種方法類似於第二種方法是引發異常。既然我們自己拋出異常,可能會拋出一個特定類型的異常,而不是一般的異常。
function credit(amount) {
if(!isInt(amount)) {
throw new InvalidAmountError(amount);
}
this.balance += amount;
}
第四種類似於拋出異常的方法是在你的代碼中使用斷言。與上述方法相比,一個缺點是由於斷言是通用的,所以我們失去了拋出定製異常的能力。儘管通過傳遞對象來拋出每個斷言調用仍然是可能的。
function credit(amount) {
assert(!isInt(amount), "Amount to credit is not an integer");
this.balance += amount;
}
全球assert
函數很容易編寫,並使代碼更短。
function assert(value, message) {
if(value !== true) {
throw new AssertionError(message);
}
}
function AssertionError(message) {
this.message = message;
}
AssertionError.prototype.toString = function() {
return 'AssertionError: ' + this.message;
}
在這些方法中,處理意外值和不愉快路徑的好方法是什麼。還有沒有其他的方法可能會有用嗎?
'alert()'是反安靜的:) – 2010-07-17 01:20:19
這是動態類型語言中最煩人的方面之一。 – ChaosPandion 2010-07-17 01:25:40
@meder - 哈哈,'alert'是他們所有人中最響亮的:) – Anurag 2010-07-17 01:30:28