亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 11:23:31
字體:
來源:轉載
供稿:網友

背景

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

是時候一站式統一處理異常?。。。ㄡ槍ue項目)

全局異常捕獲

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    }   }  }) }})

完整代碼

下面是全局處理異常的完整代碼,已經封裝成一個插件

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 { // 默認錯誤處理       return ret      }     }    })   }  })  Vue.prototype.$throw = errorHandler }}export default GlobalError

使用

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

寫在最后

增加全局異常處理有助于

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

資料參考

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频第一页| 日韩av中文字幕在线| 日韩亚洲成人av在线| 欧美xxxx18性欧美| 日韩免费黄色av| 国产精品第1页| 国产精品爱久久久久久久| 国产成人涩涩涩视频在线观看| 久久天天躁狠狠躁夜夜躁2014| 青青在线视频一区二区三区| 97婷婷涩涩精品一区| 欧美疯狂性受xxxxx另类| 亚洲伊人一本大道中文字幕| 欧美体内谢she精2性欧美| 一本大道亚洲视频| 在线观看日韩视频| 激情亚洲一区二区三区四区| 97精品视频在线| 亚洲免费电影一区| 91免费在线视频网站| 夜色77av精品影院| 91精品国产高清久久久久久| 国模精品视频一区二区三区| 国内自拍欧美激情| 91久久精品在线| 国产一区二区三区免费视频| 91福利视频在线观看| 成人福利在线视频| 中文字幕日韩在线观看| 亚洲第一精品夜夜躁人人爽| 97国产一区二区精品久久呦| 亚洲国产精品人人爽夜夜爽| 91色琪琪电影亚洲精品久久| 欧美日韩国产91| 欧美性猛交xxxx免费看| 亚洲免费高清视频| 91日韩在线播放| 欧美性一区二区三区| 一本一道久久a久久精品逆3p| 日韩有码在线视频| 亚洲美女av在线| 亚洲性日韩精品一区二区| 欧美激情第99页| 九九热在线精品视频| 国产成人精品999| 久久久精品999| 欧美最猛性xxxxx亚洲精品| 在线视频国产日韩| 欧美大片免费观看| 日韩福利在线播放| 尤物yw午夜国产精品视频| 久久精品成人欧美大片| 国产精品一区二区久久久| 色播久久人人爽人人爽人人片视av| 国产精品一香蕉国产线看观看| 亚洲人成网在线播放| 性欧美长视频免费观看不卡| 日韩av日韩在线观看| 亚洲第一级黄色片| 中文字幕精品—区二区| 国产精品日日做人人爱| 欧美日韩国产一区在线| 日韩视频免费观看| 日韩欧美中文字幕在线播放| 久久久电影免费观看完整版| 欧美电影免费观看电视剧大全| 高清在线视频日韩欧美| 亚洲精品小视频| 97视频免费观看| 国产精品久久久久久久9999| 国产成人黄色av| 91极品女神在线| 国产亚洲精品综合一区91| 国产欧美精品久久久| 91亚洲国产成人久久精品网站| 91国产美女视频| 亚洲人成网站在线播| 欧亚精品在线观看| 国产91精品在线播放| 国产精品久久久久久婷婷天堂| 最新亚洲国产精品| 国产69精品久久久久久| 色黄久久久久久| 欧美精品成人91久久久久久久| 欧美日韩精品国产| 69国产精品成人在线播放| 国产日韩欧美91| 亚洲欧洲国产伦综合| 亚洲一区亚洲二区亚洲三区| 97在线视频一区| 久久久国产视频91| 国产主播精品在线| 日韩欧美福利视频| 久久在线免费观看视频| 欧美激情精品久久久久久大尺度| 国产色视频一区| 日韩视频免费在线观看| 91热福利电影| 亚洲精品suv精品一区二区| 97久久精品人搡人人玩| 欧美一级成年大片在线观看| 91欧美激情另类亚洲| 欧美电影《睫毛膏》| 国内精品中文字幕| 性日韩欧美在线视频| 亚洲男人天堂网站| 亚洲免费伊人电影在线观看av| 色yeye香蕉凹凸一区二区av| 欧美美最猛性xxxxxx| 亚洲精品国产suv| 亚洲精品国精品久久99热| 午夜精品一区二区三区在线视频| 欧美激情久久久久久| 亚洲色图13p| 久久久免费av| 亚洲第一区中文字幕| 亚洲精品国产精品乱码不99按摩| 亚洲国产精久久久久久久| 国产视频久久久久| 久久免费精品日本久久中文字幕| 日韩av免费一区| 国产精品亚洲视频在线观看| 国产丝袜一区视频在线观看| 91精品国产一区| 成人www视频在线观看| 高清日韩电视剧大全免费播放在线观看| 亚洲人线精品午夜| 国内精品一区二区三区| 欧美体内谢she精2性欧美| 日本欧美精品在线| 久久精视频免费在线久久完整在线看| 欧美成人免费一级人片100| 久久精品99久久久久久久久| 成人信息集中地欧美| www.久久撸.com| 在线观看国产欧美| 欧美影院成年免费版| 亚洲激情视频在线播放| 国产精品第一视频| 日韩视频在线免费观看| 久久久久这里只有精品| 亚洲自拍偷拍色图| 91探花福利精品国产自产在线| 欧美精品一区二区免费| 69视频在线免费观看| 亚洲人成电影网站色xx| 91精品成人久久| 国产经典一区二区| 深夜福利日韩在线看| 日韩精品中文字| 国产精品久久久久免费a∨| 国内偷自视频区视频综合| 中文字幕欧美在线| 久久天天躁狠狠躁夜夜av| 国产精品丝袜久久久久久高清| 亚洲视频在线看| 欧美激情精品久久久久久久变态| 岛国av午夜精品| 日本欧美黄网站| 亚洲第一免费播放区| 日韩在线视频免费观看高清中文| 色婷婷综合久久久久| 国产精品免费久久久久影院| 国产成人精品a视频一区www|