详解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使用echarts图表自适应的几种解决方案
Dec 04 Vue.js
解决vue下载后台传过来的乱码流的问题
Dec 05 Vue.js
详解vue-cli项目在IE浏览器打开报错解决方法
Dec 10 Vue.js
vite2.0+vue3移动端项目实战详解
Mar 03 Vue.js
vue实现水波涟漪效果的点击反馈指令
May 31 Vue.js
Vue中foreach数组与js中遍历数组的写法说明
Jun 05 Vue.js
vue实现锚点定位功能
Jun 29 Vue.js
Vue图片裁剪组件实例代码
Jul 02 Vue.js
详解Vue router路由
Nov 20 Vue.js
Vue自定义铃声提示音组件的实现
Jan 22 Vue.js
vue项目中的支付功能实现(微信支付和支付宝支付)
Feb 18 Vue.js
vue @ ~ 相对路径 路径别名设置方式
Jun 05 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的类 功能齐全的发送邮件类
2006/10/09 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
php和nginx交互实例讲解
2019/09/24 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
jquery 表格的增行删行实现思路
2013/03/21 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
Bootstrap 网站实例之单页营销网站
2016/10/20 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
JS如何设置元素样式的方法示例
2017/08/28 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
2017/10/15 jQuery
vue使用ajax获取后台数据进行显示的示例
2018/08/09 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
结合axios对项目中的api请求进行封装操作
2020/09/21 Javascript
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
Django 跨域请求处理的示例代码
2018/05/02 Python
Python模拟登录的多种方法(四种)
2018/06/01 Python
浅谈Django的缓存机制
2018/08/23 Python
Django框架视图层URL映射与反向解析实例分析
2019/07/29 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
C#如何判断当前用户是否输入某个域
2015/12/07 面试题
四年大学生活的自我评价范文
2014/02/07 职场文书
重温入党誓词主持词
2015/06/29 职场文书
css3 选择器
2022/05/11 HTML / CSS