mirror of https://github.com/vuejs/core.git
fix(runtime-core): fix errorHandler causes an infinite loop during execution (#9575)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Haoqun Jiang <haoqunjiang@gmail.com>
This commit is contained in:
parent
31ed1f45ab
commit
ab59bedae4
|
@ -583,5 +583,31 @@ describe('error handling', () => {
|
|||
expect(handler).toHaveBeenCalledTimes(4)
|
||||
})
|
||||
|
||||
// #9574
|
||||
test('should pause tracking in error handler', async () => {
|
||||
const error = new Error('error')
|
||||
const x = ref(Math.random())
|
||||
|
||||
const handler = vi.fn(() => {
|
||||
x.value
|
||||
x.value = Math.random()
|
||||
})
|
||||
|
||||
const app = createApp({
|
||||
setup() {
|
||||
return () => {
|
||||
throw error
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
app.config.errorHandler = handler
|
||||
app.mount(nodeOps.createElement('div'))
|
||||
|
||||
await nextTick()
|
||||
expect(handler).toHaveBeenCalledWith(error, {}, 'render function')
|
||||
expect(handler).toHaveBeenCalledTimes(1)
|
||||
})
|
||||
|
||||
// native event handler handling should be tested in respective renderers
|
||||
})
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import { pauseTracking, resetTracking } from '@vue/reactivity'
|
||||
import type { VNode } from './vnode'
|
||||
import type { ComponentInternalInstance } from './component'
|
||||
import { popWarningContext, pushWarningContext, warn } from './warning'
|
||||
|
@ -127,12 +128,14 @@ export function handleError(
|
|||
// app-level handling
|
||||
const appErrorHandler = instance.appContext.config.errorHandler
|
||||
if (appErrorHandler) {
|
||||
pauseTracking()
|
||||
callWithErrorHandling(
|
||||
appErrorHandler,
|
||||
null,
|
||||
ErrorCodes.APP_ERROR_HANDLER,
|
||||
[err, exposedInstance, errorInfo],
|
||||
)
|
||||
resetTracking()
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue