refactor: improve error logging
This commit is contained in:
		
							parent
							
								
									ebf67ad208
								
							
						
					
					
						commit
						a7bcb7898f
					
				@ -1,5 +1,5 @@
 | 
				
			|||||||
import { ComponentInstance } from './component'
 | 
					import { ComponentInstance } from './component'
 | 
				
			||||||
import { warn } from './warning'
 | 
					import { warn, pushWarningContext, popWarningContext } from './warning'
 | 
				
			||||||
import { VNode } from './vdom'
 | 
					import { VNode } from './vdom'
 | 
				
			||||||
import { VNodeFlags } from './flags'
 | 
					import { VNodeFlags } from './flags'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -16,7 +16,8 @@ export const enum ErrorTypes {
 | 
				
			|||||||
  RENDER,
 | 
					  RENDER,
 | 
				
			||||||
  WATCH_CALLBACK,
 | 
					  WATCH_CALLBACK,
 | 
				
			||||||
  NATIVE_EVENT_HANDLER,
 | 
					  NATIVE_EVENT_HANDLER,
 | 
				
			||||||
  COMPONENT_EVENT_HANDLER
 | 
					  COMPONENT_EVENT_HANDLER,
 | 
				
			||||||
 | 
					  SCHEDULER
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ErrorTypeStrings: Record<number, string> = {
 | 
					const ErrorTypeStrings: Record<number, string> = {
 | 
				
			||||||
@ -32,7 +33,8 @@ const ErrorTypeStrings: Record<number, string> = {
 | 
				
			|||||||
  [ErrorTypes.RENDER]: 'render function',
 | 
					  [ErrorTypes.RENDER]: 'render function',
 | 
				
			||||||
  [ErrorTypes.WATCH_CALLBACK]: 'watcher callback',
 | 
					  [ErrorTypes.WATCH_CALLBACK]: 'watcher callback',
 | 
				
			||||||
  [ErrorTypes.NATIVE_EVENT_HANDLER]: 'native event handler',
 | 
					  [ErrorTypes.NATIVE_EVENT_HANDLER]: 'native event handler',
 | 
				
			||||||
  [ErrorTypes.COMPONENT_EVENT_HANDLER]: 'component event handler'
 | 
					  [ErrorTypes.COMPONENT_EVENT_HANDLER]: 'component event handler',
 | 
				
			||||||
 | 
					  [ErrorTypes.SCHEDULER]: 'scheduler'
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export function handleError(
 | 
					export function handleError(
 | 
				
			||||||
@ -41,6 +43,9 @@ export function handleError(
 | 
				
			|||||||
  type: ErrorTypes
 | 
					  type: ErrorTypes
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
  const isFunctional = (instance as VNode)._isVNode
 | 
					  const isFunctional = (instance as VNode)._isVNode
 | 
				
			||||||
 | 
					  const contextVNode = (isFunctional
 | 
				
			||||||
 | 
					    ? instance
 | 
				
			||||||
 | 
					    : (instance as ComponentInstance).$parentVNode) as VNode | null
 | 
				
			||||||
  let cur: ComponentInstance | null = null
 | 
					  let cur: ComponentInstance | null = null
 | 
				
			||||||
  if (isFunctional) {
 | 
					  if (isFunctional) {
 | 
				
			||||||
    let vnode = instance as VNode | null
 | 
					    let vnode = instance as VNode | null
 | 
				
			||||||
@ -61,23 +66,28 @@ export function handleError(
 | 
				
			|||||||
          cur,
 | 
					          cur,
 | 
				
			||||||
          err,
 | 
					          err,
 | 
				
			||||||
          type,
 | 
					          type,
 | 
				
			||||||
          isFunctional ? null : instance,
 | 
					          isFunctional ? null : instance
 | 
				
			||||||
          isFunctional ? instance : (instance as ComponentInstance).$parentVNode
 | 
					 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        if (captured) return
 | 
					        if (captured) return
 | 
				
			||||||
      } catch (err2) {
 | 
					      } catch (err2) {
 | 
				
			||||||
        logError(err2, ErrorTypes.ERROR_CAPTURED)
 | 
					        logError(err2, ErrorTypes.ERROR_CAPTURED, contextVNode)
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    cur = cur.$parent
 | 
					    cur = cur.$parent
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  logError(err, type)
 | 
					  logError(err, type, contextVNode)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function logError(err: Error, type: ErrorTypes) {
 | 
					function logError(err: Error, type: ErrorTypes, contextVNode: VNode | null) {
 | 
				
			||||||
  if (__DEV__) {
 | 
					  if (__DEV__) {
 | 
				
			||||||
    const info = ErrorTypeStrings[type]
 | 
					    const info = ErrorTypeStrings[type]
 | 
				
			||||||
 | 
					    if (contextVNode) {
 | 
				
			||||||
 | 
					      pushWarningContext(contextVNode)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    warn(`Unhandled error${info ? ` in ${info}` : ``}`)
 | 
					    warn(`Unhandled error${info ? ` in ${info}` : ``}`)
 | 
				
			||||||
 | 
					    if (contextVNode) {
 | 
				
			||||||
 | 
					      popWarningContext()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    console.error(err)
 | 
					    console.error(err)
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    throw err
 | 
					    throw err
 | 
				
			||||||
 | 
				
			|||||||
@ -24,15 +24,16 @@ export function warn(msg: string, ...args: any[]) {
 | 
				
			|||||||
  // TODO warn handler
 | 
					  // TODO warn handler
 | 
				
			||||||
  console.warn(`[Vue warn]: ${msg}`, ...args)
 | 
					  console.warn(`[Vue warn]: ${msg}`, ...args)
 | 
				
			||||||
  const trace = getComponentTrace()
 | 
					  const trace = getComponentTrace()
 | 
				
			||||||
 | 
					  if (!trace.length) {
 | 
				
			||||||
 | 
					    return
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  if (console.groupCollapsed) {
 | 
					  if (console.groupCollapsed) {
 | 
				
			||||||
    trace.forEach((entry, i) => {
 | 
					    console.groupCollapsed('at', ...formatTraceEntry(trace[0]))
 | 
				
			||||||
      const formatted = formatTraceEntry(entry, i)
 | 
					    const logs: string[] = []
 | 
				
			||||||
      if (i === 0) {
 | 
					    trace.slice(1).forEach((entry, i) => {
 | 
				
			||||||
        console.groupCollapsed('at', ...formatted)
 | 
					      logs.push(...formatTraceEntry(entry, i + 1))
 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        console.log(...formatted)
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
 | 
					    console.log(...logs)
 | 
				
			||||||
    console.groupEnd()
 | 
					    console.groupEnd()
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    const logs: string[] = []
 | 
					    const logs: string[] = []
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user