最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

優(yōu)雅的處理vue項(xiàng)目異常實(shí)戰(zhàn)記錄

 更新時(shí)間:2019年06月05日 11:01:17   作者:快狗打車(chē)前端團(tuán)隊(duì)  
這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅的處理vue項(xiàng)目異常的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

背景

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

是時(shí)候一站式統(tǒng)一處理異常?。。。ㄡ槍?duì)vue項(xiàng)目)

全局異常捕獲

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

注意:面對(duì)異常處理,同步異常和異步異常應(yīng)該區(qū)別對(duì)待分別處理。

vue核心源碼剖析

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

同步異常處理方案

// 定義異常處理函數(shù),判斷用戶(hù)是否自定義Vue.config.errorHandler,定義則直接調(diào)用,未定義執(zhí)行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正常執(zhí)行代碼被包裹在try內(nèi),有異常會(huì)調(diào)用globalHandleError
} catch (e) {
 globalHandleError(e, vm, '對(duì)應(yīng)信息');
}

異步異常處理方案

// 定義異步異常處理函數(shù),對(duì)于自身沒(méi)有捕獲異常的promise統(tǒng)一執(zhí)行catch
function 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可以統(tǒng)一為其定義Promise.prototype.catch()方法。
   res._handled = true;
  }
 } catch (e) {
  handleError(e, vm, info);
 }
 return res
}

// 所有的鉤子函數(shù)調(diào)用異常處理函數(shù)
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);
  }
 }
}

知識(shí)延伸

// vue接口是能處理同步異常以及部分鉤子中的異步異常,對(duì)于方法中的異常無(wú)法有效處理,我們可以仿照源碼增加方式中的異步異常處理,避免為每一個(gè)promise寫(xiě)catch
Vue.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 { // 默認(rèn)錯(cuò)誤處理
     return ret
    }
   }
  })
 }
})

完整代碼

下面是全局處理異常的完整代碼,已經(jīng)封裝成一個(gè)插件

errorPlugin.js

/**
 * 全局異常處理
 * @param {
 * } error 
 * @param {*} vm 
 */
const errorHandler = (error, vm, info) => {
 console.error('拋出全局異常')
 console.error(vm)
 console.error(error)
 console.error(info)
}
let GlobalError = {
 install: (Vue, options) => {
 /**
  * 全局異常處理
  * @param {
  * } error 
  * @param {*} vm 
  */
  Vue.config.errorHandler = errorHandler
  Vue.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(errorHandler)
      } else { // 默認(rèn)錯(cuò)誤處理
       return ret
      }
     }
    })
   }
  })
  Vue.prototype.$throw = errorHandler
 }
}
export default GlobalError

使用

// 在入口文件中引入
import ErrorPlugin from './errorPlugin'
import Vue from 'vue'
Vue.use(ErrorPlugin)

寫(xiě)在最后

增加全局異常處理有助于

  • 提高代碼健壯性
  • 減少崩潰
  • 快速定位bug

資料參考

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • vue+openlayers+nodejs+postgis實(shí)現(xiàn)軌跡運(yùn)動(dòng)效果

    vue+openlayers+nodejs+postgis實(shí)現(xiàn)軌跡運(yùn)動(dòng)效果

    使用postgres(postgis)數(shù)據(jù)庫(kù)以及nodejs作為后臺(tái),vue和openlayers做前端,openlayers使用http請(qǐng)求通過(guò)nodejs從postgres數(shù)據(jù)庫(kù)獲取數(shù)據(jù),這篇文章主要介紹了vue+openlayers+nodejs+postgis實(shí)現(xiàn)軌跡運(yùn)動(dòng),需要的朋友可以參考下
    2024-05-05
  • vue+element UI實(shí)現(xiàn)樹(shù)形表格

    vue+element UI實(shí)現(xiàn)樹(shù)形表格

    這篇文章主要為大家詳細(xì)介紹了vue+element UI實(shí)現(xiàn)樹(shù)形表格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • Vue.js 圖標(biāo)選擇組件實(shí)踐詳解

    Vue.js 圖標(biāo)選擇組件實(shí)踐詳解

    這篇文章主要介紹了Vue.js 圖標(biāo)選擇組件實(shí)踐詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Vue使用font-face自定義字體的案例詳解

    Vue使用font-face自定義字體的案例詳解

    @font-face?是?CSS?中的一個(gè)規(guī)則,它允許你加載服務(wù)器上的字體文件(遠(yuǎn)程或者本地),并在網(wǎng)頁(yè)中使用這些字體,本文給大家介紹了Vue使用font-face自定義字體的案例,并通過(guò)代碼講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • vue項(xiàng)目適配大屏端的方法示例

    vue項(xiàng)目適配大屏端的方法示例

    眾所周知在vue移動(dòng)端h5頁(yè)面當(dāng)中,適配是經(jīng)常會(huì)遇到的問(wèn)題,這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目適配大屏端的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 如何使用Vue進(jìn)行文件預(yù)覽與打印功能

    如何使用Vue進(jìn)行文件預(yù)覽與打印功能

    這篇文章主要給大家介紹了關(guān)于如何使用Vue進(jìn)行文件預(yù)覽與打印功能的相關(guān)資料,這個(gè)功能其實(shí)也是自己學(xué)習(xí)到的,做完也有一段時(shí)間了,一直想記錄總結(jié)一下,需要的朋友可以參考下
    2023-10-10
  • vue 單頁(yè)應(yīng)用和多頁(yè)應(yīng)用的優(yōu)劣

    vue 單頁(yè)應(yīng)用和多頁(yè)應(yīng)用的優(yōu)劣

    這篇文章主要介紹了vue 單頁(yè)應(yīng)用和多頁(yè)應(yīng)用的優(yōu)劣,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下
    2020-10-10
  • element el-input directive數(shù)字進(jìn)行控制

    element el-input directive數(shù)字進(jìn)行控制

    本文介紹了vue使用directive 進(jìn)行控制的方法,使用element開(kāi)發(fā)的過(guò)程中遇到循環(huán)的數(shù)據(jù)只能輸入數(shù)字,并且有不要小數(shù)點(diǎn),有需要小數(shù)點(diǎn)的,就有一定的參考價(jià)值,有興趣的可以了解一下
    2018-10-10
  • vue左右滑動(dòng)選擇日期組件封裝的方法

    vue左右滑動(dòng)選擇日期組件封裝的方法

    這篇文章主要為大家詳細(xì)介紹了vue左右滑動(dòng)選擇日期組件封裝的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vite+vue3不清除瀏覽器緩存直接下載最新代碼的解決方案

    vite+vue3不清除瀏覽器緩存直接下載最新代碼的解決方案

    vite+vue3項(xiàng)目發(fā)布后,瀏覽器上還是舊代碼,沒(méi)有及時(shí)更新到最新代碼,下面通過(guò)本文給大家分享vite+vue3不清除瀏覽器緩存直接下載最新代碼的解決方案,感興趣的朋友一起看看吧
    2024-06-06

最新評(píng)論

登封市| 钟山县| 龙游县| 股票| 米脂县| 崇礼县| 贵州省| 东丰县| 图木舒克市| 新蔡县| 乌海市| 柳州市| 婺源县| 塔城市| 封丘县| 浑源县| 濉溪县| 台山市| 木里| 昌吉市| 东阿县| 华阴市| 肥东县| 清流县| 邵阳市| 垫江县| 牟定县| 平乐县| 友谊县| 平顺县| 轮台县| 清镇市| 石渠县| 光山县| 炎陵县| 永修县| 砀山县| 奎屯市| 涪陵区| 静乐县| 泗水县|