详解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 的异常处理机制
Nov 30 Vue.js
vue组件中节流函数的失效的原因和解决方法
Dec 02 Vue.js
Vue与React的区别和优势对比
Dec 18 Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
vue实现树状表格效果
Dec 29 Vue.js
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
vue前端工程的搭建
Mar 31 Vue.js
vue实现书本翻页动画效果实例详解
Apr 08 Vue.js
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
vue3种table表格选项个数的控制方法
Apr 14 Vue.js
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
VUE解决跨域问题Access to XMLHttpRequest at
May 06 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向js函数传参的几种方法
2014/08/10 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
2012/12/11 Javascript
JavaScript之Object类型介绍
2015/04/01 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
2015/06/29 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
求js数组的最大值和最小值的四种方法
2017/03/03 Javascript
JS正则替换去空格的方法
2017/03/24 Javascript
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
javascript实现非常简单的小数取整功能示例
2017/06/13 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
2018/12/11 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
JS实现滑动导航效果
2020/01/14 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
python进程和线程用法知识点总结
2019/05/28 Python
numpy.ndarray 实现对特定行或列取值
2019/12/05 Python
python 等差数列末项计算方式
2020/05/03 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
怎样填写就业意向
2014/04/02 职场文书
如何写求职信
2014/05/24 职场文书
财务工作失职检讨书
2014/11/21 职场文书
.Net Core导入千万级数据至Mysql的步骤
2021/05/24 MySQL
5行Python代码实现一键批量扣图
2021/06/29 Python
总结Java对象被序列化的两种方法
2021/06/30 Java/Android