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:
丶远方 2024-03-19 20:47:52 +08:00 committed by GitHub
parent 31ed1f45ab
commit ab59bedae4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 0 deletions

View File

@ -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
})

View File

@ -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
}
}