详解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使用vant中的checkbox实现全选功能
Nov 17 Vue.js
vue 插槽简介及使用示例
Nov 19 Vue.js
vue中defineProperty和Proxy的区别详解
Nov 30 Vue.js
vue-router定义元信息meta操作
Dec 07 Vue.js
VUE中鼠标滚轮使div左右滚动的方法详解
Dec 14 Vue.js
vue实现图片裁剪后上传
Dec 16 Vue.js
vue-cli4.0多环境配置变量与模式详解
Dec 30 Vue.js
Vue中inheritAttrs的使用实例详解
Dec 31 Vue.js
vue-router懒加载的3种方式汇总
Feb 28 Vue.js
如何让vue长列表快速加载
Mar 29 Vue.js
Vue如何实现组件间通信
May 15 Vue.js
一篇文章告诉你如何实现Vue前端分页和后端分页
Feb 18 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动态生成虚拟现实VRML网页
2006/10/09 PHP
php函数之子字符串替换&amp;#65279; str_replace
2011/03/23 PHP
PHP Undefined index报错的修复方法
2011/07/17 PHP
PHP实现微信提现功能
2018/09/30 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
JS获取数组最大值、最小值及长度的方法
2015/11/24 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
微信小程序实现工作时间段选择
2019/02/15 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
python实现类似ftp传输文件的网络程序示例
2014/04/08 Python
11月编程语言排行榜 Python逆袭C#上升到第4
2017/11/15 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
Python发送邮件实现基础解析
2020/08/14 Python
《都江堰》教学反思
2014/02/07 职场文书
协议书模板
2014/04/23 职场文书
质量月口号
2014/06/20 职场文书
村党支部对照检查材料思想汇报
2014/09/28 职场文书
2015年党员承诺书
2015/01/21 职场文书
2015毕业寄语大全
2015/02/26 职场文书
小学思品教学反思
2016/02/20 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书