JavaScript >> Javascript 文檔 >  >> Tags >> Error

拋出 JavaScript 錯誤的藝術,第 2 部分

在我的上一篇文章中,我談到瞭如何以及何時拋出 JavaScript 錯誤。我收到了很多回復和後續問題,所以我想我會繼續討論,解釋一下如何拋出你自己的錯誤。回顧一下,基本語法是:

throw new Error("message");

這適用於所有瀏覽器,並將以與任何無意的 JavaScript 錯誤相同的方式顯示錯誤信息。 “消息”字符串存儲在 message 對象的屬性(瀏覽器用來顯示消息的屬性)。定期,我看到人們只提供字符串就拋出錯誤,例如:

throw "message";

這樣做會導致拋出錯誤,但並非所有瀏覽器都以您期望的方式響應。 Firefox、Opera 和 Chrome 都顯示“未捕獲的異常”消息,然後包含消息字符串。 Safari 和 Internet Explorer 只是拋出一個“未捕獲的異常”錯誤,根本不提供消息字符串。顯然,從調試的角度來看,這是次優的。

當然,你可以拋出你想要的任何類型的數據。沒有禁止特定數據類型的規則:

throw { name: "Nicholas" };
throw true;
throw 12345;
throw new Date();

唯一要記住的是,如果沒有通過 try-catch 捕獲任何值,則拋出任何值都會導致錯誤 陳述。 Firefox、Opera 和 Chrome 都調用 String() 在拋出的值上顯示一些邏輯作為錯誤消息; Safari 和 Internet Explorer 沒有。讓所有瀏覽器顯示您的自定義錯誤消息的唯一可靠方法是使用 Error 對象。

ECMA-262,第 3 版實際上指定了七種錯誤對像類型。這些是 JavaScript 引擎在發生各種錯誤情況時使用的,也可以手動創建:

  • Error – 所有錯誤的基本類型。從未真正被引擎拋出。
  • EvalError – 在通過 eval() 執行代碼期間發生錯誤時拋出
  • RangeError – 當數字超出其範圍時拋出。例如,嘗試創建一個包含 -20 項的數組(new Array(-20) )。這些在正常執行期間很少發生。
  • ReferenceError – 當需要一個對象但不可用時拋出,例如,試圖調用 null 上的方法 參考。
  • SyntaxError – 當代碼傳入 eval() 時拋出 有語法錯誤。
  • TypeError – 當變量屬於意外類型時拋出。例如,new 10"prop" in true .
  • URIError – 當格式不正確的 URI 字符串被傳遞到 encodeURI 時拋出 , encodeURIComponent , decodeURI , 或 decodeURIComponent .

了解存在不同類型的錯誤可以更容易處理它們。所有錯誤類型都繼承自 Error 所以用 instanceof Error 檢查類型 沒有給你任何有用的信息。通過檢查更具體的錯誤類型,您可以獲得更強大的錯誤處理:

try {
    //something that causes an error
} catch (ex){
    if (ex instanceof TypeError){
        //handle the error
    } else if (ex instanceof ReferenceError){
        //handle the error
    } else {
        //handle all others
    }
}

如果您拋出自己的錯誤,並且拋出的數據類型不是錯誤,那麼您可以更輕鬆地區分您自己的錯誤和瀏覽器拋出的錯誤。然而,拋出實際的 Error 有幾個優點 對象而不是其他對像類型。

首先,如前所述,錯誤消息將顯示在瀏覽器的正常錯誤處理機制中。二、瀏覽器將額外的信息附加到Error 當它們被拋出時。這些因瀏覽器而異,但它們提供錯誤的上下文信息,例如行號和列號,在某些瀏覽器中,還提供堆棧和源信息。當然,如果您只使用 Error,您將無法區分自己的錯誤和瀏覽器引發的錯誤 構造函數。

解決方案是創建您自己的繼承自 Error 的錯誤類型 .例如:

function MyError(message){
    this.message = message;
}

MyError.prototype = new Error();

這段代碼有兩個重要部分:1) message 屬性,這是瀏覽器知道實際錯誤字符串所必需的,並且 2) 將原型設置為 Error 的實例 ,它將對象標識為 JavaScript 引擎的錯誤。現在,您可以拋出 MyError 的實例 讓瀏覽器像原生錯誤一樣響應:

throw new MyError("Hello world!");

這種方法的唯一警告是版本 8 之前的 Internet Explorer 不會顯示錯誤消息。相反,您會看到通用的“拋出但未捕獲的異常”錯誤消息。拋出自定義錯誤對象允許您專門針對自己的錯誤進行測試:

try {
    //something that causes an error
} catch (ex){
    if (ex instanceof MyError){
        //handle my own errors
    } else {
        //handle all others
    }
}

如果你總是發現你拋出的任何錯誤,那麼 IE 的輕微愚蠢應該不是那麼重要。在具有適當錯誤處理的系統中,這種方法的好處是巨大的。這種方法為您確定針對給定錯誤的正確行動方案提供了更多的靈活性和信息。


Tutorial JavaScript 教程
  1. 什麼時候在 React 中使用 useMemo 和 useCallback?

  2. 從頭開始使用 Gatsby 構建博客

  3. 終極 ReactJS 資源🛠面向 Web 開發人員 2022👨‍💻

  4. 初學者的函數式編程

  5. 如何從 rgb/rgba 字符串中獲取紅色綠色和藍色值?

  6. [CodePen] 註冊表單+動畫背景。

  7. 設置“npx 用戶名”卡!

  1. 如何在 ClearScript 下使用 V8 更新 System.Data 數據行中的列?

  2. JavaScript 平方根:Math.sqrt() 方法

  3. 使用 CodeLobster 加速 jQuery 開發

  4. 如何集中對齊 TemplateField 的標題文本?

  5. 什麼是 Web 套接字?在 Node.js 中實現 Web 套接字

  6. Electron 和 Svelte 入門

  7. 我用 Rails 和 Javascript 創建了相同的應用程序

  1. 使用 ChartJS 和 Hamoni Sync 的 JavaScript 實時圖表

  2. SVG 變得簡單

  3. 開始使用 Gridsome

  4. Soft UI React Native - 開源模板