详解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+iview实现文件上传
Nov 17 Vue.js
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 Vue.js
vue+element UI实现树形表格
Dec 29 Vue.js
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 Vue.js
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
vue element el-transfer增加拖拽功能
Jan 15 Vue.js
vue二选一tab栏切换新做法实现
Jan 19 Vue.js
vite2.0+vue3移动端项目实战详解
Mar 03 Vue.js
vue-cropper组件实现图片切割上传
May 27 Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 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
文件上传的实现
2006/10/09 PHP
php 禁止页面缓存输出
2009/01/07 PHP
收藏的PHP常用函数 推荐收藏保存
2010/02/21 PHP
教你如何快捷的使用cmd访问mysql小技巧
2014/05/26 PHP
教你如何用php实现LOL数据远程获取
2014/06/10 PHP
js 实现菜单上下显示附效果图
2013/11/21 Javascript
利用try-catch判断变量是已声明未声明还是未赋值
2014/03/12 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
2016/12/13 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
JS简单验证上传文件类型的方法
2017/04/17 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
JS设计模式之单例模式(一)
2017/09/29 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
原生javascript实现类似vue的数据绑定功能示例【观察者模式】
2020/02/24 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
python 快速排序代码
2009/11/23 Python
python转换字符串为摩尔斯电码的方法
2015/07/06 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
在python里从协程返回一个值的示例
2019/02/19 Python
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
python查看数据类型的方法
2019/10/12 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
Python3 元组tuple入门基础
2020/02/09 Python
python实现IOU计算案例
2020/04/12 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
flask开启多线程的具体方法
2020/08/02 Python
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
党日活动总结
2014/05/07 职场文书
平面设计师岗位职责
2014/09/18 职场文书
党员个人剖析材料
2014/09/30 职场文书
2015年教学工作总结
2015/04/02 职场文书
超市收银员岗位职责
2015/04/07 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
JavaScript实现音乐播放器
2022/08/14 Javascript