详解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实现指令式动态追加小球动画组件的步骤
Dec 18 Vue.js
Vue使用鼠标在Canvas上绘制矩形
Dec 24 Vue.js
vue实现树状表格效果
Dec 29 Vue.js
梳理一下vue中的生命周期
Dec 30 Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 Vue.js
Vue和Flask通信的实现
May 19 Vue.js
Vue实现tab导航栏并支持左右滑动功能
Jun 28 Vue.js
Vue.Draggable实现交换位置
Apr 07 Vue.js
vue中this.$http.post()跨域和请求参数丢失的解决
Apr 08 Vue.js
vue实现列表垂直无缝滚动
Apr 08 Vue.js
VUE之图片Base64编码使用ElementUI组件上传
Apr 09 Vue.js
vue二维数组循环嵌套方式 循环数组、循环嵌套数组
Apr 24 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中Closure类的使用方法及详解
2015/10/09 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
JavaScript延迟加载
2021/03/09 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
js实现浏览本地文件并显示扩展名的方法
2015/08/17 Javascript
详解js中class的多种函数封装方法
2016/01/03 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
Angular+ionic实现折叠展开效果的示例代码
2020/07/29 Javascript
javascript实现雪花飘落效果
2020/08/19 Javascript
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
python中获得当前目录和上级目录的实现方法
2017/10/12 Python
浅谈python写入大量文件的问题
2018/11/09 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
django中SMTP发送邮件配置详解
2019/07/19 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
一些.net面试题
2014/10/06 面试题
简单的JAVA编程面试题
2013/03/19 面试题
市场营销专业个人求职信范文
2013/12/14 职场文书
大学生党员自我评价范文
2014/04/09 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
我的小天地教学反思
2014/04/30 职场文书
会计入职心得体会
2016/01/22 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
python tkinter模块的简单使用
2021/04/07 Python
JS实现扫雷项目总结
2021/05/19 Javascript