2010-07-17 15 views
9

如果發生錯誤並且功能無法繼續前進,那麼在JavaScript中報告錯誤而不是依賴於空值,以及未定義什麼是一種好方法。我能想到的三種方法:指示故障的JavaScript反靜音技術

  1. 無能爲力
  2. 拋出一個異常
  3. 斷言

下面是一個簡單的示例場景 - 這歸功於在通過量的用戶帳戶的功能。函數creditAccount對象的一部分。

這是天真的解決方案。

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; 
} 

在這些方法中,處理意外值和不愉快路徑的好方法是什麼。還有沒有其他的方法可能會有用嗎?

+2

'alert()'是反安靜的:) – 2010-07-17 01:20:19

+0

這是動態類型語言中最煩人的方面之一。 – ChaosPandion 2010-07-17 01:25:40

+0

@meder - 哈哈,'alert'是他們所有人中最響亮的:) – Anurag 2010-07-17 01:30:28

回答

2

考慮客戶端日誌框架來報告錯誤,如Log4js。人們可以在瀏覽器中記錄消息(即信息,調試,警告,錯誤)或通過Ajax將消息持久保存到服務器,具體取決於應用程序。

Log4js站點還提供了list of other JavaScript logging frameworks

使用您的自定義異常示例,一種好方法是拋出異常並按照您認爲合適的日誌記錄錯誤。

2

一個缺點相比,上述 的做法是,既然斷言是 通用的,我們失去拋出 自定義異常

不一定的能力:

function assert(value,message,Exctype) { 
    if(value !== true) throw new Exctype(message); 
} 

構造器功能。函數是一流的值。隨時通過他們周圍。