详解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 +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 Vue.js
vue打开其他项目页面并传入数据详解
Nov 25 Vue.js
vue单元格多列合并的实现
Nov 26 Vue.js
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
Dec 15 Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 Vue.js
vue-resource 拦截器interceptors使用详解
Jan 18 Vue.js
Vue 事件的$event参数=事件的值案例
Jan 29 Vue.js
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
vue-router中hash模式与history模式的区别
Jun 23 Vue.js
Vue中Object.assign清空数据报错的解决方案
Mar 03 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 str_pad 函数使用详解
2009/01/13 PHP
php生成静态文件的多种方法分享
2012/07/17 PHP
php生成图形验证码几种方法小结
2013/08/15 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
PHP处理CSV表格文件的常用操作方法总结
2016/07/01 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
Jquery实现兼容各大浏览器的Enter回车切换输入焦点的方法
2014/09/01 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
Vue.js 中 axios 跨域访问错误问题及解决方法
2018/11/21 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
Django框架模板文件使用及模板文件加载顺序分析
2019/05/23 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
2019/08/13 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
教师廉洁自律承诺书
2014/05/26 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
清明节扫墓活动总结
2015/02/09 职场文书
学生会主席任命书
2015/09/21 职场文书
小学班主任培训心得体会
2016/01/07 职场文书
python实现高效的遗传算法
2021/04/07 Python
python实现自动化群控的步骤
2021/04/11 Python
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript
2021年国漫热度排行前十,完美世界上榜,第四是美国动画作品
2022/03/18 国漫