From ded4a131a5dbc74854bf79a3dbe5cb84d5fd6661 Mon Sep 17 00:00:00 2001 From: Chris Nicola Date: Fri, 19 May 2017 13:46:55 -0700 Subject: [PATCH 1/2] Add handleError during event handling Currently handleError is used to handle errors during lifecycle hooks. This commit adds this functionality in to the event handling for consistency. --- src/core/instance/events.js | 8 ++++++-- test/unit/features/error-handling.spec.js | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/core/instance/events.js b/src/core/instance/events.js index 57d0edee30e..3b160ac91f4 100644 --- a/src/core/instance/events.js +++ b/src/core/instance/events.js @@ -1,7 +1,7 @@ /* @flow */ import { updateListeners } from '../vdom/helpers/index' -import { toArray, tip, hyphenate, formatComponentName } from '../util/index' +import { toArray, tip, hyphenate, formatComponentName, handleError } from '../util/index' export function initEvents (vm: Component) { vm._events = Object.create(null) @@ -121,7 +121,11 @@ export function eventsMixin (Vue: Class) { cbs = cbs.length > 1 ? toArray(cbs) : cbs const args = toArray(arguments, 1) for (let i = 0, l = cbs.length; i < l; i++) { - cbs[i].apply(vm, args) + try { + cbs[i].apply(vm, args) + } catch (e) { + handleError(e, vm, `event handler for "${event}"`) + } } } return vm diff --git a/test/unit/features/error-handling.spec.js b/test/unit/features/error-handling.spec.js index 6f8fd044e2f..033f9a3b7d5 100644 --- a/test/unit/features/error-handling.spec.js +++ b/test/unit/features/error-handling.spec.js @@ -11,7 +11,8 @@ describe('Error handling', () => { ['beforeCreate', 'beforeCreate hook'], ['created', 'created hook'], ['beforeMount', 'beforeMount hook'], - ['directive bind', 'directive foo bind hook'] + ['directive bind', 'directive foo bind hook'], + ['event', 'event handler for "e"'] ].forEach(([type, description]) => { it(`should recover from errors in ${type}`, done => { const vm = createTestInstance(components[type]) @@ -215,6 +216,19 @@ function createErrorTestComponents () { } } + // event errors + components.event = { + beforeCreate () { + this.$on('e', () => { throw new Error('event') }) + }, + mounted () { + this.$emit('e') + }, + render (h) { + return h('div') + } + } + return components } From 0431ac74bd7c99cff4aec08bc5d5eb9baea28ef6 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 29 May 2017 14:23:37 +0800 Subject: [PATCH 2/2] style tweak --- src/core/instance/events.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/core/instance/events.js b/src/core/instance/events.js index 3b160ac91f4..a81f2b7e3a1 100644 --- a/src/core/instance/events.js +++ b/src/core/instance/events.js @@ -1,7 +1,13 @@ /* @flow */ +import { + tip, + toArray, + hyphenate, + handleError, + formatComponentName +} from '../util/index' import { updateListeners } from '../vdom/helpers/index' -import { toArray, tip, hyphenate, formatComponentName, handleError } from '../util/index' export function initEvents (vm: Component) { vm._events = Object.create(null)