Vue3 错误处理机制errorCaptured、errorHandler

11 min read

onErrorCaptured()

注册一个钩子,在捕获了后代组件传递的错误时调用。

  • 类型

    function onErrorCaptured(callback: ErrorCapturedHook): void
    
    type ErrorCapturedHook = (
      err: unknown,
      instance: ComponentPublicInstance | null,
      info: string
    ) => boolean | void
    

    详细信息

    错误可以从以下几个来源中捕获:

    • 组件渲染
    • 事件处理器
    • 生命周期钩子
    • setup() 函数
    • 侦听器
    • 自定义指令钩子
    • 过渡钩子

    这个钩子带有三个实参:错误对象、触发该错误的组件实例,以及一个说明错误来源类型的信息字符串。

    你可以在 errorCaptured() 中更改组件状态来为用户显示一个错误状态。然而重要的是,不要让错误状态渲染为导致本次错误的内容,否则组件就会进入无限的渲染循环中。

    这个钩子可以通过返回 false 来阻止错误继续传递。请看下方的传递细节介绍。

    错误传播规则

    • 默认情况下,所有的错误都会被发送到应用级app.config.errorHandler (前提是这个函数已经定义),这样这些错误都能在一个统一的地方报告给分析服务。
    • 如果组件的继承链或组件链上存在多个 errorCaptured 钩子,对于同一个错误,这些钩子都会被调用。
    • 如果 errorCaptured 钩子本身抛出了一个错误,那么这个错误和原来捕获到的错误都将被发送到 app.config.errorHandler
    • errorCaptured 钩子可以通过返回 false 来阻止错误继续传递。即表示“这个错误已经被处理了,应当被忽略”,它将阻止其他的 errorCaptured 钩子或 app.config.errorHandler 因这个错误而被调用。

app.config.errorHandler

用于为应用内传递的未捕获的错误指定一个全局处理函数。

  • 类型

    interface AppConfig {
      errorHandler?: (
        err: unknown,
        instance: ComponentPublicInstance | null,
        // `info` 是一个 Vue 特定的错误信息
        // 例如:错误是在哪个生命周期的钩子上抛出的
        info: string
      ) => void
    }
    
  • 详细信息

    错误处理器接收三个参数:错误对象、触发该错误的组件实例和一个指出错误来源类型信息的字符串。

    它可以从下面这些来源中捕获错误:

    • 组件渲染器
    • 事件处理器
    • 生命周期钩子
    • setup() 函数
    • 侦听器
    • 自定义指令钩子
    • 过渡 (Transition) 钩子
  • 示例

    app.config.errorHandler = (err, instance, info) => {
      // 处理错误,例如:报告给一个服务
    }