currentInstance,
setCurrentInstance
} from './component'
-import { applyErrorHandling, ErrorTypeStrings } from './errorHandling'
+import { callUserFnWithErrorHandling, ErrorTypeStrings } from './errorHandling'
import { warn } from './warning'
import { capitalize } from '@vue/shared'
target: ComponentInstance | null = currentInstance
) {
if (target) {
- // wrap user hook with error handling logic
- const withErrorHandling = applyErrorHandling(hook, target, type)
;(target[type] || (target[type] = [])).push((...args: any[]) => {
// Set currentInstance during hook invocation.
// This assumes the hook does not synchronously trigger other hooks, which
// can only be false when the user does something really funky.
setCurrentInstance(target)
- const res = withErrorHandling(...args)
+ const res = callUserFnWithErrorHandling(hook, target, type, args)
setCurrentInstance(null)
return res
})
type ErrorTypes = LifecycleHooks | UserExecutionContexts
-// takes a user-provided function and returns a verison that handles potential
-// errors (including async)
-export function applyErrorHandling<T extends Function>(
- fn: T,
+export function callUserFnWithErrorHandling(
+ fn: Function,
instance: ComponentInstance | null,
- type: ErrorTypes
-): T {
- return function errorHandlingWrapper(...args: any[]) {
- let res: any
- try {
- res = fn(...args)
- if (res && !res._isVue && typeof res.then === 'function') {
- ;(res as Promise<any>).catch(err => {
- handleError(err, instance, type)
- })
- }
- } catch (err) {
- handleError(err, instance, type)
+ type: ErrorTypes,
+ args?: any[]
+) {
+ let res: any
+ try {
+ res = args ? fn(...args) : fn()
+ if (res && !res._isVue && typeof res.then === 'function') {
+ ;(res as Promise<any>).catch(err => {
+ handleError(err, instance, type)
+ })
}
- return res
- } as any
+ } catch (err) {
+ handleError(err, instance, type)
+ }
+ return res
}
export function handleError(