详解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中使用mockjs代码实例
Nov 25 Vue.js
vue使用echarts图表自适应的几种解决方案
Dec 04 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
vue实现按钮切换图片
Jan 20 Vue.js
Vue中的nextTick作用和几个简单的使用场景
Jan 25 Vue.js
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
Vue单页面应用中实现Markdown渲染
Feb 14 Vue.js
VUE实现吸底按钮
Mar 04 Vue.js
vue-cropper插件实现图片截取上传组件封装
May 27 Vue.js
关于Vue中的options选项
Mar 22 Vue.js
Vue.Draggable实现交换位置
Apr 07 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的FTP学习(二)
2006/10/09 PHP
php更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
PHP与Java进行通信的实现方法
2013/10/21 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
angular2使用简单介绍
2016/03/01 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
JavaScript瀑布流布局实现代码
2017/05/06 Javascript
vue元素实现动画过渡效果
2017/07/01 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
在Mac OS上搭建Python的开发环境
2015/12/24 Python
python中list列表的高级函数
2016/05/17 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2016/07/11 面试题
英智兴达软件测试笔试题
2016/10/12 面试题
大学专科生推荐信范文
2013/11/23 职场文书
党员承诺书怎么写
2014/05/20 职场文书
优质服务口号
2014/06/11 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
Feign调用传输文件异常的解决
2021/06/24 Java/Android
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
使用 Apache 反向代理的设置技巧
2022/01/18 Servers