切換語言為:簡體

聊聊 JavaScript 以及 Vue 如何對錯誤進行捕獲

  • 爱糖宝
  • 2024-06-13
  • 2107
  • 0
  • 0

1.錯誤捕獲

錯誤捕獲是前端錯誤監控平臺的關鍵步驟,透過捕獲 JavaScript 執行時產生的錯誤,平臺能夠實時地感知到應用程式的健康狀況。以下是錯誤捕獲的主要內容:

全域性錯誤事件監聽

前端錯誤監控平臺通常會註冊全域性的錯誤事件監聽器,例如 window.onerror。這個事件在發生未被捕獲的錯誤時觸發,提供了一個機會來捕獲錯誤並執行相應的處理邏輯。

window.onerror = function(message, source, lineno, colno, error) {// 處理錯誤資訊// 上報錯誤資料
};


透過這個事件,平臺可以捕獲到錯誤的訊息、發生錯誤的指令碼檔案、行號、列號以及錯誤物件本身。

對應引數:

ErrorEvent.prototype.message 只讀

一個`字串`,包含了所發生錯誤的描述資訊。


ErrorEvent.prototype.filename 只讀

一個 `字串`,包含了發生錯誤的指令碼檔案的檔名。


ErrorEvent.prototype.lineno 只讀

一個數字,包含了錯誤發生時所在的行號。


ErrorEvent.prototype.colno 只讀

一個數字,包含了錯誤發生時所在的列號。


ErrorEvent.prototype.error 只讀 實驗性

發生錯誤時所丟擲的 `Error` 物件。


錯誤型別

JavaScript 中常見的錯誤型別有多種,下面列舉了一些主要的錯誤型別

  1. ReferenceError(引用錯誤):

window.onerror = function(message, source, lineno, colno, error) {
    console.error(`Error Type: ${error.name}`);
    console.error(`Error Message: ${error.message}`);
    console.error(`Source: ${source}`);
    console.error(`Line: ${lineno}`);
    console.error(`Column: ${colno}`);
};

function referenceErrorExample() {
    // 嘗試訪問未定義的變數
    console.log(undefinedVariable);
}

referenceErrorExample();


  1. TypeError(型別錯誤):

window.onerror = function(message, source, lineno, colno, error) {
    console.error(`Error Type: ${error.name}`);
    console.error(`Error Message: ${error.message}`);
    console.error(`Source: ${source}`);
    console.error(`Line: ${lineno}`);
    console.error(`Column: ${colno}`);
};

function typeErrorExample() {
    // 嘗試對非函式型別的變數進行呼叫
    null();
}

typeErrorExample();


  1. SyntaxError(語法錯誤):

window.onerror = function(message, source, lineno, colno, error) {
    console.error(`Error Type: ${error.name}`);
    console.error(`Error Message: ${error.message}`);
    console.error(`Source: ${source}`);
    console.error(`Line: ${lineno}`);
    console.error(`Column: ${colno}`);
};

function syntaxErrorExample() {
    // 語法錯誤,如括號不匹配
    console.log('Hello World';
}

syntaxErrorExample();


  1. RangeError(範圍錯誤):

window.onerror = function(message, source, lineno, colno, error) {
    console.error(`Error Type: ${error.name}`);
    console.error(`Error Message: ${error.message}`);
    console.error(`Source: ${source}`);
    console.error(`Line: ${lineno}`);
    console.error(`Column: ${colno}`);
};

function rangeErrorExample() {
    // 嘗試傳遞超出範圍的數值給函式
    const arr = new Array(-1);
}

rangeErrorExample();


這些示例展示了一些常見的錯誤型別,並透過 window.onerror 進行錯誤捕獲。在實際應用中,爲了更好地處理錯誤,通常會根據錯誤型別進行適當的處理和上報。

非同步錯誤捕獲

對於非同步操作中的錯誤,例如 Promise 或者 setTimeout 中的錯誤,平臺還需額外處理。一種常見的方式是透過 window.addEventListener 監聽 unhandledrejection 事件。

window.addEventListener('unhandledrejection', function(event) {
// 處理非同步錯誤資訊// 上報錯誤資料
});


這樣,平臺能夠捕獲到 Promise 中未被處理的錯誤。

window.addEventListener

  1. 引數不同:這個事件處理函式的引數是一個 Event 物件,包含了 error 屬性,它也是一個包含錯誤資訊的物件。

  2. 錯誤捕獲的範圍: window.onerror 主要用於捕獲全域性的未被捕獲的錯誤,包括執行時錯誤、語法錯誤、非同步操作中的錯誤等。但是,它無法捕獲某些型別的錯誤,比如資源載入錯誤(例如圖片載入失敗)。window.addEventListener('error') 可以用於捕獲更多型別的錯誤,包括資源載入錯誤,如圖片、指令碼、樣式表載入失敗等

  3. 多個監聽器的處理方式:window.onerror 只允許設定一個全域性錯誤事件監聽器。window.addEventListener('error') 允許註冊多個錯誤事件監聽器,它們將按照註冊的順序執行。

  4. 阻止預設行為的方式:window.onerror 回撥函式可以返回 true 來阻止瀏覽器預設的錯誤處理行為。在 window.addEventListener('error', function(event) {}) 的回撥函式中,可以呼叫 event.preventDefault() 來阻止瀏覽器預設的錯誤處理行為。

window.addEventListener('error', function(event) {
// 圖片、script、css載入錯誤,都能被捕獲
});

vue

在 Vue 中,你可以透過配置 errorHandler 來捕獲全域性的錯誤。Vue 提供了一個全域性的錯誤處理器,可以用來捕獲元件渲染和生命週期鉤子中的錯誤。透過這個錯誤處理器,你可以自定義錯誤的處理方式,包括上報到錯誤監控平臺。傳入 Vue 例項是爲了更好地融入 Vue 生態系統,方便獲取當前元件的上下文資訊。

下面是一個完整的 Vue 錯誤捕獲的示例:

// main.js
import Vue from 'vue';
import App from './App.vue';

Vue.config.productionTip = false;

// 全域性錯誤處理器
Vue.config.errorHandler = function(err, vm, info) {
    // err: 錯誤物件// vm: Vue 例項,發生錯誤的元件
    // info: Vue 特定的錯誤資訊,比如錯誤所在的生命週期鉤子
    // 在實際應用中,你可以將錯誤資訊上報到錯誤監控平臺c
    onsole.error('Vue Error:', err, info);
    // 如果需要阻止該錯誤繼續傳播,可以返回 false// return false;
};

new Vue({
    render: h => h(App),
}).$mount('#app');


2.錯誤資訊採集

錯誤資訊採集階段是爲了獲取更多關於錯誤的上下文資訊,以便更好地分析和解決問題。下面詳細介紹錯誤資訊採集的實現方法:

堆疊軌跡資訊

透過錯誤物件的堆疊軌跡(stack trace),平臺可以獲取導致錯誤的函式呼叫鏈。這對於定位錯誤位置非常有幫助。

window.onerror = function(message, source, lineno, colno, error) {
    const stackTrace = error.stack;// 上報錯誤資料,包含堆疊軌跡資訊
};

錯誤發生位置

window.onerror 事件中,source 引數提供了發生錯誤的指令碼檔案的 URL。結合行號和列號,可以準確地定位到錯誤發生的位置。

window.onerror = function(message, source, lineno, colno, error) {
    const errorLocation = `${source}:${lineno}:${colno}`;// 上報錯誤資料,包含錯誤發生位置資訊
};

錯誤型別判斷

錯誤物件中的 name 屬性通常包含了錯誤的型別。透過判斷錯誤型別,平臺可以對錯誤進行分類,有針對性地進行處理。

window.onerror = function(message, source, lineno, colno, error) {
    const errorType = error.name;// 根據錯誤型別進行處理// 上報錯誤資料,包含錯誤型別資訊
};


參考: developer.mozilla.org/en-US/docs/…

developer.mozilla.org/zh-CN/docs/…


0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.