
- Javascript 基礎教程
- Javascript - 首頁
- JavaScript - 路線圖
- JavaScript - 概述
- JavaScript - 特性
- JavaScript - 啟用
- JavaScript - 放置位置
- JavaScript - 語法
- JavaScript - Hello World
- JavaScript - Console.log()
- JavaScript - 註釋
- JavaScript - 變數
- JavaScript - let 語句
- JavaScript - 常量
- JavaScript - 資料型別
- JavaScript - 型別轉換
- JavaScript - 嚴格模式
- JavaScript - 保留關鍵字
- JavaScript 運算子
- JavaScript - 運算子
- JavaScript - 算術運算子
- JavaScript - 比較運算子
- JavaScript - 邏輯運算子
- JavaScript - 位運算子
- JavaScript - 賦值運算子
- JavaScript - 條件運算子
- JavaScript - typeof 運算子
- JavaScript - 空值合併運算子
- JavaScript - 刪除運算子
- JavaScript - 逗號運算子
- JavaScript - 分組運算子
- JavaScript - Yield 運算子
- JavaScript - 展開運算子
- JavaScript - 冪運算子
- JavaScript - 運算子優先順序
- JavaScript 控制流
- JavaScript - If...Else
- JavaScript - While 迴圈
- JavaScript - For 迴圈
- JavaScript - For...in
- Javascript - For...of
- JavaScript - 迴圈控制
- JavaScript - Break 語句
- JavaScript - Continue 語句
- JavaScript - Switch Case
- JavaScript - 使用者定義迭代器
- JavaScript 函式
- JavaScript - 函式
- JavaScript - 函式表示式
- JavaScript - 函式引數
- JavaScript - 預設引數
- JavaScript - Function() 建構函式
- JavaScript - 函式提升
- JavaScript - 自執行函式
- JavaScript - 箭頭函式
- JavaScript - 函式呼叫
- JavaScript - Function call()
- JavaScript - Function apply()
- JavaScript - Function bind()
- JavaScript - 閉包
- JavaScript - 變數作用域
- JavaScript - 全域性變數
- JavaScript - 智慧函式引數
- JavaScript 物件
- JavaScript - Number
- JavaScript - Boolean
- JavaScript - Strings
- JavaScript - Arrays
- JavaScript - Date
- JavaScript - DataView
- JavaScript - Handler
- JavaScript - Math
- JavaScript - RegExp
- JavaScript - Symbol
- JavaScript - Sets
- JavaScript - WeakSet
- JavaScript - Maps
- JavaScript - WeakMap
- JavaScript - 可迭代物件
- JavaScript - Reflect
- JavaScript - TypedArray
- JavaScript - 模板字面量
- JavaScript - 標籤模板
- 面向物件 JavaScript
- JavaScript - 物件
- JavaScript - 類
- JavaScript - 物件屬性
- JavaScript - 物件方法
- JavaScript - 靜態方法
- JavaScript - 顯示物件
- JavaScript - 物件訪問器
- JavaScript - 物件建構函式
- JavaScript - 原生原型
- JavaScript - ES5 物件方法
- JavaScript - 封裝
- JavaScript - 繼承
- JavaScript - 抽象
- JavaScript - 多型
- JavaScript - 解構賦值
- JavaScript - 物件解構
- JavaScript - 陣列解構
- JavaScript - 巢狀解構
- JavaScript - 可選鏈
- JavaScript - 全域性物件
- JavaScript - Mixins
- JavaScript - 代理
- JavaScript 版本
- JavaScript - 歷史
- JavaScript - 版本
- JavaScript - ES5
- JavaScript - ES6
- ECMAScript 2016
- ECMAScript 2017
- ECMAScript 2018
- ECMAScript 2019
- ECMAScript 2020
- ECMAScript 2021
- ECMAScript 2022
- JavaScript 非同步
- JavaScript - 非同步
- JavaScript - 回撥函式
- JavaScript - Promises
- JavaScript - Async/Await
- JavaScript - 微任務
- JavaScript - Promise 化
- JavaScript - Promises 鏈式呼叫
- JavaScript - 定時事件
- JavaScript - setTimeout()
- JavaScript - setInterval()
- JavaScript Cookies
- JavaScript - Cookies
- JavaScript - Cookie 屬性
- JavaScript - 刪除 Cookies
- JavaScript 瀏覽器 BOM
- JavaScript - 瀏覽器物件模型
- JavaScript - Window 物件
- JavaScript - Document 物件
- JavaScript - Screen 物件
- JavaScript - History 物件
- JavaScript - Navigator 物件
- JavaScript - Location 物件
- JavaScript - Console 物件
- JavaScript Web APIs
- JavaScript - Web API
- JavaScript - History API
- JavaScript - Storage API
- JavaScript - Forms API
- JavaScript - Worker API
- JavaScript - Fetch API
- JavaScript - Geolocation API
- JavaScript 事件
- JavaScript - 事件
- JavaScript - DOM 事件
- JavaScript - addEventListener()
- JavaScript - 滑鼠事件
- JavaScript - 鍵盤事件
- JavaScript - 表單事件
- JavaScript - 視窗/文件事件
- JavaScript - 事件委託
- JavaScript - 事件冒泡
- JavaScript - 事件捕獲
- JavaScript - 自定義事件
- JavaScript 錯誤處理
- JavaScript - 錯誤處理
- JavaScript - try...catch
- JavaScript - 除錯
- JavaScript - 自定義錯誤
- JavaScript - 擴充套件錯誤
- JavaScript 重要關鍵字
- JavaScript - this 關鍵字
- JavaScript - void 關鍵字
- JavaScript - new 關鍵字
- JavaScript - var 關鍵字
- JavaScript HTML DOM
- JavaScript - HTML DOM
- JavaScript - DOM 方法和屬性
- JavaScript - DOM 文件
- JavaScript - DOM 元素
- JavaScript - DOM 屬性 (Attr)
- JavaScript - DOM 表單
- JavaScript - 更改 HTML
- JavaScript - 更改 CSS
- JavaScript - DOM 動畫
- JavaScript - DOM 導航
- JavaScript - DOM 集合
- JavaScript - DOM NodeList
- JavaScript - DOM DOMTokenList
- JavaScript 雜項
- JavaScript - Ajax
- JavaScript - 非同步迭代
- JavaScript - Atomics 物件
- JavaScript - Rest 引數
- JavaScript - 頁面重定向
- JavaScript - 對話方塊
- JavaScript - 頁面列印
- JavaScript - 驗證
- JavaScript - 動畫
- JavaScript - 多媒體
- JavaScript - 影像地圖
- JavaScript - 瀏覽器
- JavaScript - JSON
- JavaScript - 多行字串
- JavaScript - 日期格式
- JavaScript - 獲取日期方法
- JavaScript - 設定日期方法
- JavaScript - 模組
- JavaScript - 動態匯入
- JavaScript - BigInt
- JavaScript - Blob
- JavaScript - Unicode
- JavaScript - 淺複製
- JavaScript - 呼叫棧
- JavaScript - 引用型別
- JavaScript - IndexedDB
- JavaScript - Clickjacking 攻擊
- JavaScript - 柯里化
- JavaScript - 圖形
- JavaScript - Canvas
- JavaScript - 防抖
- JavaScript - 效能
- JavaScript - 樣式指南
JavaScript - 錯誤與異常處理
JavaScript 中的錯誤處理是一個檢測和處理程式執行過程中出現的錯誤的過程。錯誤可以是語法錯誤、執行時錯誤或邏輯錯誤。程式執行過程中發生的錯誤稱為執行時錯誤或異常。
在 JavaScript 中,錯誤可能由於程式設計錯誤、使用者輸入錯誤等原因導致。錯誤會中斷程式碼執行並導致糟糕的使用者體驗。有效的錯誤和異常處理對於構建健壯、可靠且使用者友好的 JavaScript 應用程式至關重要。
什麼是錯誤?
錯誤是在程式執行過程中發生的事件,阻止程式正常繼續執行。錯誤可能由多種因素導致,例如語法錯誤、執行時錯誤和邏輯錯誤。
語法錯誤
語法錯誤,也稱為解析錯誤,在傳統的程式語言中發生在編譯時,在 JavaScript 中發生在解釋時。
例如,以下行會導致語法錯誤,因為它缺少一個閉合括號。
<script> window.print(); </script>
當 JavaScript 中發生語法錯誤時,只有包含語法錯誤的同一執行緒中的程式碼受到影響,其他執行緒中的其餘程式碼將繼續執行,假設它們中沒有任何內容依賴於包含錯誤的程式碼。
執行時錯誤(異常)
執行時錯誤,也稱為異常,發生在執行期間(編譯/解釋之後)。
例如,以下行會導致執行時錯誤,因為這裡的語法是正確的,但在執行時,它試圖呼叫一個不存在的方法。
<script> window.printme(); </script>
異常也會影響發生它們的執行緒,允許其他 JavaScript 執行緒繼續正常執行。
有很多 JavaScript 執行時錯誤(異常),其中一些如下所示:
ReferenceError - 嘗試訪問未定義的變數/方法。
TypeError - 嘗試對不相容的資料型別進行操作。
RangeError - 值超出允許的範圍。
邏輯錯誤
邏輯錯誤可能是最難追蹤的錯誤型別。這些錯誤不是語法或執行時錯誤的結果。相反,當你在驅動指令碼的邏輯中犯錯並且沒有得到預期的結果時,就會發生這些錯誤。
例如,當你將任何數值除以 10 時,它會返回 undefined。
<script> let num = 10/0; </script>
什麼是錯誤處理?
每當 JavaScript 程式碼中發生任何錯誤時,JavaScript 引擎都會停止整個程式碼的執行。如果你以正確的方式處理這些錯誤,你可以跳過有錯誤的程式碼並繼續執行其他 JavaScript 程式碼。
你可以使用以下機制來處理錯誤。
try...catch...finally 語句
throw 語句
onerror() 事件處理程式屬性
自定義錯誤
try...catch...finally 語句
最新版本的 JavaScript 添加了異常處理功能。JavaScript 實現了 try...catch...finally 結構以及 throw 運算子來處理異常。
你可以捕獲程式設計師生成的和執行時異常,但你無法捕獲 JavaScript 語法錯誤。
以下是 try...catch...finally 塊的語法:
<script> try { // Code to run [break;] } catch ( e ) { // Code to run if an exception occurs [break;] } [ finally { // Code that is always executed regardless of // an exception occurring }] </script>
try 塊後面必須緊跟一個 catch 塊或一個 finally 塊(或兩者之一)。當 try 塊中發生異常時,異常將放置在 e 中並執行 catch 塊。可選的 finally 塊在 try/catch 後無條件執行。
示例
以下是一個示例,我們嘗試呼叫一個不存在的函式,這反過來會引發異常。
讓我們嘗試使用 try...catch 捕獲此異常並顯示一條使用者友好的訊息。如果要隱藏此錯誤,你也可以禁止顯示此訊息。
你可以使用 finally 塊,它將在 try/catch 後始終無條件執行。
<html> <head> <script> try { var a = 100; alert(myFunc(a)); } catch (e) { alert(e); } finally { alert("Finally block will always execute!" ); } </script> </head> <body> <p>Exception handling using try...catch...finally statements</p> </body> </html>
輸出
Exception handling using try...catch...finaly statements
throw 語句
你可以使用 throw 語句來引發你的內建異常或你的自定義異常。稍後可以捕獲這些異常,並且你可以採取適當的操作。
示例
以下示例演示瞭如何使用 throw 語句。
<html> <head> <script> function myFunc() { var a = 100; var b = 0; try { if ( b == 0 ) { throw( "Divide by zero error." ); } else { var c = a / b; } } catch ( e ) { alert("Error: " + e ); } } </script> </head> <body> <p>Click the following to see the result:</p> <form> <input type = "button" value = "Click Me" onclick = "myFunc();" /> </form> </body> </html>
輸出
Click the following to see the result: Click Me
您可以使用字串、整數、布林值或物件在一個函式中丟擲異常,然後您可以在與上面相同的函式中捕獲該異常,或者在另一個函式中使用 try...catch 塊捕獲該異常。
onerror 事件處理程式屬性
onerror 事件處理程式是 JavaScript 中首個用於簡化錯誤處理的功能。onerror 是 'window' 物件的一個事件處理程式屬性,當網頁上的任何元素髮生任何錯誤時,它會自動觸發。您可以呼叫回撥函式來處理發生的任何錯誤。
您可以按照以下語法使用 onerror 事件處理程式屬性。
window.onerror = errorhandler_func; OR <ele onerror="errorhandler_func()"> </ele>
在上述語法中,當發生任何錯誤時將執行 errorhandler_func()。
onerror 事件處理程式提供三條資訊來識別錯誤的確切性質:
錯誤訊息 - 瀏覽器針對給定錯誤顯示的相同訊息
URL - 發生錯誤的檔案
行號 - 給定 URL 中導致錯誤的行號
示例
在下面的程式碼中,我們在 <input> 元素上添加了 onclick 事件,並在使用者點選輸入元素時呼叫了 myFunc() 函式。myFunc() 函式未定義。因此,它會丟擲一個錯誤。
我們使用 'onerror' 事件處理程式來捕獲錯誤。在回撥函式中,我們在發生錯誤的檔案中列印錯誤訊息、檔案 URL 和行號。
<html> <body> <p> Click the following button to see the result:</p> <form> <input type = "button" value = "Click Me" onclick = "myFunc();" /> </form> <div id = "demo"> </div> <script> const output = document.getElementById("demo"); window.onerror = function (msg, url, line) { output.innerHTML = "Error: " + msg + "<br>"; output.innerHTML += "URL: " + url + "<br>"; output.innerHTML += "Line: " + line + "<br>"; } </script> </body> </html>
輸出
Click the following button to see the result: Click Me Error: Uncaught ReferenceError: myFunc is not defined URL: file:///C:/Users/Lenovo/Desktop/intex.html Line: 5
您可以使用 onerror 方法(如下所示)在載入影像時出現任何問題的情況下顯示錯誤訊息。
<img src="myimage.gif" onerror="alert('An error occurred loading the image.')" />
您可以將 onerror 與許多 HTML 標籤一起使用,以便在發生錯誤時顯示適當的訊息。
JavaScript Error 類和 Error 物件
每當程式碼中發生任何錯誤時,JavaScript 都會丟擲一個 Error 類的例項(物件)。Error 物件包含有關錯誤的資訊。
但是,Error() 是所有型別錯誤的通用建構函式,但對於不同型別的錯誤存在不同的物件。
JavaScript 自定義錯誤
您還可以使用 Error() 建構函式丟擲帶有自定義訊息的錯誤。
const customError = new Error(message); customError.name = "CustomError";
這裡,我們建立了 'Error' 類的例項並將 'message' 作為引數傳遞。此外,我們還更改了 'name' 屬性的值。類似地,如果您不想將其作為 Error() 建構函式引數傳遞,則可以更改 'message' 屬性的值。
JavaScript Error 物件參考
JavaScript 錯誤型別或建構函式
JavaScript 包含以下型別的錯誤。您也可以將其用作建構函式來建立特定型別的新的錯誤。
錯誤型別/物件 | 描述 |
---|---|
Error | 它是錯誤的通用建構函式。您還可以透過擴充套件 Error 物件來建立自定義錯誤。 |
SyntaxError | 當語法中存在任何錯誤時,會丟擲 SyntaxError 的例項。例如,缺少括號、無效的 JSON 等。 |
ReferenceError | 當您嘗試訪問當前作用域中未定義的變數時,就會發生引用錯誤。 |
TypeError | 當變數的型別無效時,JavaScript 會丟擲型別錯誤。 |
RangeError | 當數值輸入超出範圍時,它會丟擲範圍錯誤。 |
URIError | 當您向 decodeURI 或 encodeURI 方法傳遞無效引數時,JavaScript 會丟擲 URIError。 |
EvalError | 已棄用。 |
AggregateError | 它用於將多個錯誤物件聚合到單個錯誤物件中,並且允許您處理多個錯誤物件。 |
Error 物件屬性
Error 物件包含兩個屬性。
屬性 | 描述 |
---|---|
name | 用於設定或獲取錯誤名稱。 |
message | 用於設定或獲取錯誤訊息。 |
非標準屬性和方法
以下是 Error 物件的非標準屬性和方法列表。但是,它們並非所有瀏覽器都支援。因此,您應該避免使用它們。
屬性 | 描述 |
---|---|
columnNumber | 僅在 Firefox 瀏覽器中受支援。 |
description | 僅在 Microsoft 瀏覽器中受支援。 |
displayName | 僅在 Firefox 瀏覽器中受支援。 |
fileName | 僅在 Firefox 瀏覽器中受支援。 |
lineNumber | 僅在 Firefox 瀏覽器中受支援。 |
number | 僅在 Microsoft 瀏覽器中受支援。 |
stack | 僅在 Firefox 瀏覽器中受支援。 |
internalError() | 僅在 Firefox 瀏覽器中受支援。 |
toSource() | 它是 Error 物件的非標準方法。 |