test: test for app-level APIs
This commit is contained in:
@@ -13,6 +13,8 @@ export const enum ErrorTypes {
|
||||
NATIVE_EVENT_HANDLER,
|
||||
COMPONENT_EVENT_HANDLER,
|
||||
DIRECTIVE_HOOK,
|
||||
APP_ERROR_HANDLER,
|
||||
APP_WARN_HANDLER,
|
||||
SCHEDULER
|
||||
}
|
||||
|
||||
@@ -38,6 +40,8 @@ export const ErrorTypeStrings: Record<number | string, string> = {
|
||||
[ErrorTypes.NATIVE_EVENT_HANDLER]: 'native event handler',
|
||||
[ErrorTypes.COMPONENT_EVENT_HANDLER]: 'component event handler',
|
||||
[ErrorTypes.DIRECTIVE_HOOK]: 'directive hook',
|
||||
[ErrorTypes.APP_ERROR_HANDLER]: 'app errorHandler',
|
||||
[ErrorTypes.APP_WARN_HANDLER]: 'app warnHandler',
|
||||
[ErrorTypes.SCHEDULER]:
|
||||
'scheduler flush. This may be a Vue internals bug. ' +
|
||||
'Please open an issue at https://new-issue.vuejs.org/?repo=vuejs/vue'
|
||||
@@ -81,24 +85,34 @@ export function handleError(
|
||||
type: AllErrorTypes
|
||||
) {
|
||||
const contextVNode = instance ? instance.vnode : null
|
||||
let cur: ComponentInstance | null = instance && instance.parent
|
||||
while (cur) {
|
||||
const errorCapturedHooks = cur.ec
|
||||
if (errorCapturedHooks !== null) {
|
||||
for (let i = 0; i < errorCapturedHooks.length; i++) {
|
||||
if (
|
||||
errorCapturedHooks[i](
|
||||
err,
|
||||
instance && instance.renderProxy,
|
||||
// in production the hook receives only the error code
|
||||
__DEV__ ? ErrorTypeStrings[type] : type
|
||||
)
|
||||
) {
|
||||
return
|
||||
if (instance) {
|
||||
let cur: ComponentInstance | null = instance.parent
|
||||
// the exposed instance is the render proxy to keep it consistent with 2.x
|
||||
const exposedInstance = instance.renderProxy
|
||||
// in production the hook receives only the error code
|
||||
const errorInfo = __DEV__ ? ErrorTypeStrings[type] : type
|
||||
while (cur) {
|
||||
const errorCapturedHooks = cur.ec
|
||||
if (errorCapturedHooks !== null) {
|
||||
for (let i = 0; i < errorCapturedHooks.length; i++) {
|
||||
if (errorCapturedHooks[i](err, exposedInstance, errorInfo)) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
cur = cur.parent
|
||||
}
|
||||
// app-level handling
|
||||
const appErrorHandler = instance.appContext.config.errorHandler
|
||||
if (appErrorHandler) {
|
||||
callWithErrorHandling(
|
||||
appErrorHandler,
|
||||
null,
|
||||
ErrorTypes.APP_ERROR_HANDLER,
|
||||
[err, exposedInstance, errorInfo]
|
||||
)
|
||||
return
|
||||
}
|
||||
cur = cur.parent
|
||||
}
|
||||
logError(err, type, contextVNode)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user