国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

優雅的處理vue項目異常實戰記錄

2024-05-06 15:38:22
字體:
來源:轉載
供稿:網友

背景

你還在為處理Uncaught (in promise) ReferenceError煩惱嗎? 你還在為捕獲異常反復的寫try catch嗎? 你還在為每一個promise寫catch嗎?

是時候一站式統一處理異常!!!(針對vue項目)

全局異常捕獲

Vue.config.errorHandler = function (err, vm, info) { // 指定組件的渲染和觀察期間未捕獲錯誤的處理函數。這個處理函數被調用時,可獲取錯誤信息和 Vue 實例。  // handle error // `info` 是 Vue 特定的錯誤信息,比如錯誤所在的生命周期鉤子 // 只在 2.2.0+ 可用 }

注意:面對異常處理,同步異常和異步異常應該區別對待分別處理。

vue核心源碼剖析

通過閱讀源碼看一下vue是如何將Vue.config.errorHandler接口暴露給使用者。

同步異常處理方案

// 定義異常處理函數,判斷用戶是否自定義Vue.config.errorHandler,定義則直接調用,未定義執行vue本身異常處理。function globalHandleError(err, vm, info) { if (Vue.config.errorHandler) {  try {   return config.errorHandler.call(null, err, vm, info)  } catch (e) {   logError(e, null, 'config.errorHandler');  } } logError(err, vm, info);}try { // vue正常執行代碼被包裹在try內,有異常會調用globalHandleError} catch (e) { globalHandleError(e, vm, '對應信息');}

異步異常處理方案

// 定義異步異常處理函數,對于自身沒有捕獲異常的promise統一執行catchfunction invokeWithErrorHandling( handler, context, args, vm, info) { var res; try {  res = args ? handler.apply(context, args) : handler.call(context);  if (res && !res._isVue && isPromise(res) && !res._handled) {   res.catch(function (e) { return handleError(e, vm, info + " (Promise/async)"); });   // 異步代碼例如promise可以統一為其定義Promise.prototype.catch()方法。   res._handled = true;  } } catch (e) {  handleError(e, vm, info); } return res}// 所有的鉤子函數調用異常處理函數function callHook(vm, hook) { var handlers = vm.$options[hook]; // 為所有鉤子增加異常處理 var info = hook + " hook"; if (handlers) {  for (var i = 0, j = handlers.length; i < j; i++) {   invokeWithErrorHandling(handlers[i], vm, null, vm, info);  } }}

知識延伸

// vue接口是能處理同步異常以及部分鉤子中的異步異常,對于方法中的異常無法有效處理,我們可以仿照源碼增加方式中的異步異常處理,避免為每一個promise寫catchVue.mixin({ beforeCreate() {  const methods = this.$options.methods || {}  Object.keys(methods).forEach(key => {   let fn = methods[key]   this.$options.methods[key] = function (...args) {    let ret = fn.apply(this, args)    if (ret && typeof ret.then === 'function' && typeof ret.catch === "function") {     return ret.catch(Vue.config.errorHandler)    } else { // 默認錯誤處理     return ret    }   }  }) }})            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 盐津县| 天峨县| 米易县| 德州市| 公安县| 台州市| 清河县| 错那县| 来安县| 和政县| 高密市| 共和县| 莆田市| 台江县| 承德县| 全椒县| 新邵县| 富平县| 化隆| 石林| 泗洪县| 公安县| 社旗县| 红河县| 越西县| 崇左市| 锦州市| 鄂托克前旗| 进贤县| 浑源县| 石阡县| 岳普湖县| 盐源县| 乌苏市| 新安县| 宝丰县| 凤台县| 凌海市| 南木林县| 涡阳县| 晋中市|