詳解Vue 的異常處理機(jī)制
最近需要在業(yè)務(wù)中加一個全局的 filter,filter 會對輸入進(jìn)行驗證,用于進(jìn)行前端監(jiān)控。其中一個要處理的問題,就是驗證失敗后如何發(fā)送異常日志,這個過程中順便了解了一下 vue 的異常處理機(jī)制。
errorCaptured、errorHandler
vue 提供了兩個 API 用于異常的捕獲,分別是 errorCaptured 和 errorHandler:
- errorCaptured
errorCaptured 是組件的一個鉤子函數(shù),用于在組件級別捕獲異常。當(dāng)這個鉤子函數(shù)返回 false 時,會阻止異常進(jìn)一步向上冒泡,否則會不斷向父組件傳遞,直到 root 組件。
- errorHandler
errorHandler 是一個全局的配置項,用來在全局捕獲異常。例如Vue.config.errorHandler = function (err, vm, info) {}。
error.js
在 vue 源碼中,異常處理的邏輯放在 /src/core/util/error.js 中:
import config from '../config' import { warn } from './debug' import { inBrowser } from './env' export function handleError (err: Error, vm: any, info: string) { if (vm) { let cur = vm while ((cur = cur.$parent)) { const hooks = cur.$options.errorCaptured if (hooks) { for (let i = 0; i < hooks.length; i++) { try { const capture = hooks[i].call(cur, err, vm, info) === false if (capture) return } catch (e) { globalHandleError(e, cur, 'errorCaptured hook') } } } } } globalHandleError(err, vm, info) } function globalHandleError (err, vm, info) { if (config.errorHandler) { try { return config.errorHandler.call(null, err, vm, info) } catch (e) { logError(e, null, 'config.errorHandler') } } logError(err, vm, info) } function logError (err, vm, info) { if (process.env.NODE_ENV !== 'production') { warn(`Error in ${info}: "${err.toString()}"`, vm) } /* istanbul ignore else */ if (inBrowser && typeof console !== 'undefined') { console.error(err) } else { throw err } }
文件不長,向外暴露了一個 handleError 方法,在需要捕獲異常的地方調(diào)用。handleError 方法中首先獲取到報錯的組件,之后遞歸查找當(dāng)前組件的父組件,依次調(diào)用 errorCaptured 方法。在遍歷調(diào)用完所有 errorCaptured 方法、或 errorCaptured 方法有報錯時,會調(diào)用 globalHandleError 方法。
globalHandleError 方法調(diào)用了全局的 errorHandler 方法。
如果 errorHandler 方法自己又報錯了呢?生產(chǎn)環(huán)境下會使用 console.error 在控制臺中輸出。
可以看到 errorCaptured 和 errorHandler 的觸發(fā)時機(jī)都是相同的,不同的是 errorCaptured 發(fā)生在前,且如果某個組件的 errorCaptured 方法返回了 false,那么這個異常信息不會再向上冒泡也不會再調(diào)用 errorHandler 方法。
以上就是詳解Vue 的異常處理機(jī)制的詳細(xì)內(nèi)容,更多關(guān)于vue 異常處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue動態(tài)數(shù)據(jù)實現(xiàn)?el-select?多級聯(lián)動、數(shù)據(jù)回顯方式
這篇文章主要介紹了Vue動態(tài)數(shù)據(jù)實現(xiàn)?el-select?多級聯(lián)動、數(shù)據(jù)回顯方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07關(guān)于vue打包時的publicPath就是打包后靜態(tài)資源的路徑問題
這篇文章主要介紹了vue打包時的publicPath,就是打包后靜態(tài)資源的路徑,本文通過三種情況分析給大家詳細(xì)介紹,需要的朋友可以參考下2022-07-07使用Bootstrap + Vue.js實現(xiàn)添加刪除數(shù)據(jù)示例
本篇文章主要介紹了使用Bootstrap + Vue.js實現(xiàn) 添加刪除數(shù)據(jù)示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-02-02Monaco?Editor開發(fā)SQL代碼提示編輯器實例詳解
這篇文章主要為大家介紹了Monaco?Editor開發(fā)SQL編輯器實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08vue開發(fā)之LogicFlow自定義業(yè)務(wù)節(jié)點
這篇文章主要為大家介紹了vue開發(fā)之LogicFlow自定義業(yè)務(wù)節(jié)點,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01axios全局注冊,設(shè)置token,以及全局設(shè)置url請求網(wǎng)段的方法
今天小編就為大家分享一篇axios全局注冊,設(shè)置token,以及全局設(shè)置url請求網(wǎng)段的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09