详解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+vant实现购物车全选和反选功能
Nov 17 Vue.js
vue实现下载文件流完整前后端代码
Nov 17 Vue.js
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 Vue.js
Vue如何跨组件传递Slot的实现
Dec 14 Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
vue.js实现点击图标放大离开时缩小的代码
Jan 27 Vue.js
vue如何使用rem适配
Feb 06 Vue.js
vue-element-admin项目导入和导出的实现
May 21 Vue.js
vue3种table表格选项个数的控制方法
Apr 14 Vue.js
使用vuex-persistedstate本地存储vuex
Apr 29 Vue.js
Vue2项目中对百度地图的封装使用详解
Jun 16 Vue.js
vue递归实现树形组件
Jul 15 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
Discuz!5的PHP代码高亮显示插件(黑暗中的舞者更新)
2007/01/29 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
关于文本限制字数的js代码
2007/04/02 Javascript
javawscript 三级菜单的实现原理
2009/07/01 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
javascript制作幻灯片(360度全景图片)
2015/07/28 Javascript
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
在Python中使用模块的教程
2015/04/27 Python
KMP算法精解及其Python版的代码示例
2016/06/01 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
详解python运行三种方式
2019/05/13 Python
简单了解python代码优化小技巧
2019/07/08 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
如何通过python检查文件是否被占用
2020/12/18 Python
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
Java如何获得ResultSet的总行数
2016/09/03 面试题
计算机专业毕业生自荐信
2013/12/31 职场文书
房地产活动策划方案
2014/05/14 职场文书
三八活动策划方案
2014/08/17 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
出纳工作检讨书
2014/10/18 职场文书
2014年党员整改措施
2014/10/24 职场文书
导游词之无锡古运河
2019/11/14 职场文书