本文共 3951 字,大约阅读时间需要 13 分钟。
第一种:引用一个不能存在的变量:
Hello, { {name}}
[Vue warn]
消息。 第二种:将变量绑定到一个被计算出来的属性,计算的时候会抛出异常。
Hello, { {name2}}
[Vue warn]
和一个常规的错误,网页白屏。 第三种:执行一个会抛出异常的方法
[Vue warn]
和常规报错。 和上一个错误的区别在于,只有你点击了按钮才会触发函数调用,才会报错。 如果在组件渲染时出现运行错误,错误将会被传递至全局Vue.config.errorHandler
配置函数 (如果已设置)。 利用这个钩子函数来配合错误跟踪服务是个不错的主意。 比如 Sentry ,它为 Vue 提供了 官方集成 。
errorHandler
warnHandler
renderError
errorCaptured
window.onerror (不仅仅针对Vue)
Vue.config.errorHandler = function(err, vm, info) { }
err
指代error对象, info
是一个Vue特有的字符串, vm
指代Vue应用本身。 记住在一个页面你可以有多个Vue应用。 这个error handler作用到所有的应用。 Vue.config.errorHandler = function(err, vm, info) { console.log(`Error: ${err.toString()}\nInfo: ${info}`); }
Error: ReferenceError: x is not defined Info: render
Error: ReferenceError: x is not defined Info: v-on handler
info
里面的信息也是非常有用的。 Vue.config.warnHandler = function(msg, vm, trace) { }
msg
和 vm
都容易理解, trace
代表了组件树。 请看下面的例子: Vue.config.warnHandler = function(msg, vm, trace) { console.log(`Warn: ${msg}\nTrace: ${trace}`); }
warnHandler
捕获: Warn: Property or method 'name' is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties. Trace: (found in)
const app = new Vue({ el:'#app', renderError (h, err) { return h('pre', { style: { color: 'red' }}, err.stack) } })
当捕获一个来自子孙组件的错误时被调用。 此钩子会收到三个参数: 错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。 此钩子可以返回false
以阻止该错误继续向上传播。
Vue.component('cat', { template:``, props:{ name:{ required:true, type:String } }, errorCaptured(err,vm,info) { console.log(`cat EC: ${err.toString()}\ninfo: ${info}`); return false; } }); Vue.component('kitten', { template:'Cat:
', props:{ name:{ required:true, type:String } } });Kitten: { { dontexist() }}
kitten
组件的代码是有BUG的。 cat EC: TypeError: dontexist is not a function info: render
errorCaptured
是个很有趣的特性,我想哪些构建组件库的开发者应该会用到吧。 这个特性更像是一个面向组件开发者而不是一般开发者。 window.onerror = function(message, source, line, column, error) { }
source
难以从字面上理解吧,它代表了当前的URL。 onerror
,但是没有启用 Vue.config.errorHandler
,那么有很多异常都抓不到。 Vue希望你要定义它,否则异常不会抛出去的。 这到底有没有意义? 我不是很懂,我觉得没必要,甚至有点奇怪。 errorHandler
的代码有BUG,那么运行起来也不会被 onerror
抓到。 下面的例子中,如果将 oopsIDidItAgain()
解注释,你就会发现这个问题。 只有第二个按钮没有和Vue绑定,所以报错无论如何都会被抓到。 运行实例 转载地址:http://ayfpi.baihongyu.com/