详解Vue 的异常处理机制


Posted in Vue.js onNovember 30, 2020

最近需要在业务中加一个全局的 filter,filter 会对输入进行验证,用于进行前端监控。其中一个要处理的问题,就是验证失败后如何发送异常日志,这个过程中顺便了解了一下 vue 的异常处理机制。

errorCaptured、errorHandler

vue 提供了两个 API 用于异常的捕获,分别是 errorCaptured 和 errorHandler:

  1. errorCaptured

errorCaptured 是组件的一个钩子函数,用于在组件级别捕获异常。当这个钩子函数返回 false 时,会阻止异常进一步向上冒泡,否则会不断向父组件传递,直到 root 组件。

  1. 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 方法,在需要捕获异常的地方调用。handleError 方法中首先获取到报错的组件,之后递归查找当前组件的父组件,依次调用 errorCaptured 方法。在遍历调用完所有 errorCaptured 方法、或 errorCaptured 方法有报错时,会调用 globalHandleError 方法。

globalHandleError 方法调用了全局的 errorHandler 方法。

如果 errorHandler 方法自己又报错了呢?生产环境下会使用 console.error 在控制台中输出。

可以看到 errorCaptured 和 errorHandler 的触发时机都是相同的,不同的是 errorCaptured 发生在前,且如果某个组件的 errorCaptured 方法返回了 false,那么这个异常信息不会再向上冒泡也不会再调用 errorHandler 方法。

以上就是详解Vue 的异常处理机制的详细内容,更多关于vue 异常处理的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue+iview分页组件的封装
Nov 17 Vue.js
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
vue监听键盘事件的相关总结
Jan 29 Vue.js
Vue实现圆环进度条的示例
Feb 06 Vue.js
Vue3 Composition API的使用简介
Mar 29 Vue.js
vue2实现provide inject传递响应式
May 21 Vue.js
vue+element ui实现锚点定位
Jun 29 Vue.js
Vue实现跑马灯样式文字横向滚动
Nov 23 Vue.js
vue实现移动端div拖动效果
Mar 03 Vue.js
教你部署vue项目到docker
Apr 05 Vue.js
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
Apr 11 Vue.js
使用vuex-persistedstate本地存储vuex
Apr 29 Vue.js
ESLint 是如何检查 .vue 文件的
Nov 30 #Vue.js
Vue用mixin合并重复代码的实现
Nov 27 #Vue.js
使用vue编写h5公众号跳转小程序的实现代码
Nov 27 #Vue.js
在Vue中使用CSS3实现内容无缝滚动的示例代码
Nov 27 #Vue.js
vuex的数据渲染与修改浅析
Nov 26 #Vue.js
vue动态合并单元格并添加小计合计功能示例
Nov 26 #Vue.js
vue单元格多列合并的实现
Nov 26 #Vue.js
You might like
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
2011/12/16 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
在WordPress中实现发送http请求的相关函数解析
2015/12/29 PHP
php-msf源码详解
2017/12/25 PHP
js获取当前页面路径示例讲解
2014/01/08 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
JavaScript数组复制详解
2017/02/02 Javascript
Nodejs 发送Post请求功能(发短信验证码例子)
2017/02/09 NodeJs
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
javascript 日期相减-在线教程(附代码)
2017/08/17 Javascript
js前端导出Excel的方法
2017/11/01 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
ES6模板字符串和标签模板的应用实例分析
2019/06/25 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
[46:28]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
讲解Python中fileno()方法的使用
2015/05/24 Python
Python3.6连接Oracle数据库的方法详解
2018/05/18 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
python list转矩阵的实例讲解
2018/08/04 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
python selenium 弹出框处理的实现
2019/02/26 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
如何利用python正则表达式匹配版本信息
2020/12/09 Python
美国网上花店:JustFlowers
2017/02/12 全球购物
英国翻新电子产品购物网站:Tech Trade
2017/12/25 全球购物
安全大检查实施方案
2014/02/22 职场文书
迎国庆演讲稿
2014/09/05 职场文书
优秀员工推荐材料
2014/12/20 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
解决Springboot PostMapping无法获取数据的问题
2022/05/06 Java/Android
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python