详解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中的checkbox实现全选功能
Nov 17 Vue.js
一篇超完整的Vue新手入门指导教程
Nov 18 Vue.js
详解Vue 的异常处理机制
Nov 30 Vue.js
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
Dec 02 Vue.js
vue 使用class创建和清除水印的示例代码
Dec 25 Vue.js
vue实现按钮切换图片
Jan 20 Vue.js
vue3.0中使用element的完整步骤
Mar 04 Vue.js
vue组件的路由高亮问题解决方法
May 11 Vue.js
vue基于Teleport实现Modal组件
May 31 Vue.js
详解Vue router路由
Nov 20 Vue.js
vue3语法糖内的defineProps及defineEmits
Apr 14 Vue.js
Vue操作Storage本地化存储
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
基于Linux调试工具strace与gdb的常用命令总结
2013/06/03 PHP
mac下安装nginx和php
2013/11/04 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
利用laravel搭建一个迷你博客实战教程
2017/08/13 PHP
smarty模板的使用方法实例分析
2019/09/18 PHP
javaScript call 函数的用法说明
2010/04/09 Javascript
JavaScript判断密码强度(自写代码)
2013/09/06 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
基于javascript实现动态显示当前系统时间
2016/01/28 Javascript
JavaScript 冒泡排序和选择排序的实现代码
2016/09/03 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
js a标签点击事件
2017/03/30 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
JQuery中queue方法用法示例
2019/01/31 jQuery
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
Python计算一个文件里字数的方法
2015/06/15 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
python re模块匹配贪婪和非贪婪模式详解
2020/02/11 Python
简单总结CSS3中视窗单位Viewport的常见用法
2016/02/04 HTML / CSS
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
c++工程师面试问题
2013/08/04 面试题
小学清明节活动方案
2014/03/08 职场文书
初三学习计划书范文
2014/04/30 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
2015年司法所工作总结
2015/04/27 职场文书
2016年情人节广告语
2016/01/28 职场文书