Vue3捕获和处理不同层级的异常/错误的有效方法

 更新时间:2025年01月20日 11:04:57   作者:Turtle  
项目中如果没有对异常做处理,可能导致应用崩溃或显示报错信息影响用户体验,因此需要对不同层级的错误进行捕获,所以本文给大家介绍了Vue3捕获和处理不同层级的异常/错误的有效方法,需要的朋友可以参考下

引言

项目中如果没有对异常做处理,可能导致应用崩溃或显示报错信息影响用户体验。因此需要对不同层级的错误进行捕获,确保用户即使在错误发生时仍能使用应用的其他功能或者能查看到更友好的提示消息。

组件级异常捕获:

  • 单组件 使用 errorCaptured 钩子来捕获单一组件中的错误。
<template>
 <button @click="test">抛出错误</button>
</template>
<script setup lang="ts">
const test = () => {
  throw 'error'
}
onErrorCaptured((err, instance, info)=>{
  console.log('错误:',err, instance, info)
})
</script>
  • 多组件(跨多个组件的错误边界

使用方式:

// index.vue
<template>
   <ErrorBoundary>
      <router-view v-slot="{ Component, route }">
        <template v-if="Component">
          <component :is="Component" :key="route.name" />
        </template>
      </router-view>
    </ErrorBoundary>
</template>
<script setup lang="ts">
import ErrorBoundary from "@/components/error/ErrorBoundary.vue";
</script>

实现方式:

// 404.vue
<template>
  <el-result
    status="404"
    title="404"
    sub-title="Sorry, the page you visited does not exist."
  >
    <template #extra>
      <a-button type="primary" @click="onChange"> 回到首页 </a-button>
    </template>
  </el-result>
</template>
<script lang="ts">
export default {
  name: "NotFound",
};
</script>
<script lang="ts" setup>
import { defineEmits } from "vue";
const emit = defineEmits(["change"]);
const onChange = () => {
  emit("change", false);
};
</script>

// ErrorBoundary.vue
<template>
  <div v-if="isError">
    <NotFound @change="handleErrorChange" />
    </div>
  <div v-else>
    <slot></slot>
  </div>
</template>
<script setup lang="ts">
import router from "@/router";
import NotFound from "@/components/error/404.vue";
import { onErrorCaptured, ref } from "vue";
const isError = ref(false);
onErrorCaptured((err, vm, info) => {
  console.error(
    "[捕获错误]",
    err.message,
    "vm",
    vm,
    "info",
    info,
    window.history
  );
  isError.value = true;
  return false; // onErrorCaptured 早于window.onerror 等执行,这里捕获了返回false就不会向上继续抛出了
});

const handleErrorChange = (isError: boolean) => {
  if (!isError) {
    // 在这里进行错误处理
    // router.push("/").then(() => {
    //   location.reload();
    // });
  }
};
</script>

全局异常捕获

  • 使用 app.config.errorHandler 设置全局错误处理器来捕获未通过组件级别捕获的错误。
import { createApp } from "vue";
import App from "./App.vue";
const app = createApp(App);
app.config.errorHandler = (err, instance, info) => {
    // 这里可以执行全局的错误处理逻辑,比如上报服务器
    console.error('Global error handler:', err, { instance, info });
  };
  • 通过window事件捕获 可以添加全局的 window 事件来捕获未处理的错误和未捕获的 Promise 异常。
window.addEventListener(
  "error",
  (e) => {
    console.log("全局报错捕获", e);
    return true;
  },
  true
);

// 处理未捕获的异常,主要是promise内部异常,统一抛给 onerror
window.addEventListener("unhandledrejection", (e) => {
  throw e.reason;
});

代码级局部捕获

使用 try-catch 捕获异步或特定代码块中的错误。

const fetchData = async () => {
   try {
     const response = await fetch('https://api.example.com/data');
     result.value = await response.json();
   } catch (error) {
     console.error('Error fetching data:', error);
     // 局部错误处理逻辑
   }
};

总结

通过以上几种方法,可以在 Vue 3 项目中可以有效地捕获和处理不同层级的错误,从而提升用户体验。

到此这篇关于Vue3捕获和处理不同层级的异常/错误的有效方法的文章就介绍到这了,更多相关Vue3捕获和处理不同层级错误内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue组件之高德地图地址选择功能的实例代码

    Vue组件之高德地图地址选择功能的实例代码

    这篇文章主要介绍了Vue组件之 高德地图地址选择功能的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • 详解vue-cli之webpack3构建全面提速优化

    详解vue-cli之webpack3构建全面提速优化

    这篇文章主要介绍了详解vue-cli之webpack3构建全面提速优化,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 浅谈Vue-cli 命令行工具分析

    浅谈Vue-cli 命令行工具分析

    本篇文章主要介绍了浅谈Vue-cli 命令行工具分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Vue基础教程之条件渲染和列表渲染

    Vue基础教程之条件渲染和列表渲染

    Vue会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做会使Vue变得非常快,下面这篇文章主要给大家介绍了Vue基础教程之条件渲染和列表渲染的相关资料,需要的朋友可以参考下
    2021-11-11
  • 在Vue前端(Vue2/Vue3 通用)载入JSON格式的动图实例代码

    在Vue前端(Vue2/Vue3 通用)载入JSON格式的动图实例代码

    这篇文章主要介绍了在Vue前端(Vue2/Vue3 通用)载入JSON格式动图的相关资料,文中通过代码讲解了环境配置、组件集成、动画控制等,重点介绍了Lottie的loadAnimation方法的参数配置和常见问题解决方法,需要的朋友可以参考下
    2025-11-11
  • 一文教会你搭建vite项目并配置路由和element-plus

    一文教会你搭建vite项目并配置路由和element-plus

    由于项目搭建过程实在繁琐,容易遗忘,每次新建项目还得百度一下怎么搭建,所以写下本文提醒自己,下面这篇文章主要给大家介绍了关于搭建vite项目并配置路由和element-plus的相关资料,需要的朋友可以参考下
    2022-07-07
  • 详解Vue 多级组件透传新方法provide/inject

    详解Vue 多级组件透传新方法provide/inject

    这篇文章主要介绍了详解Vue 多级组件透传新方法provide/inject,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • uni app仿微信顶部导航条功能

    uni app仿微信顶部导航条功能

    这篇文章主要介绍了uni-app自定义导航栏按钮|uniapp仿微信顶部导航条功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • vue实现上传图片添加水印

    vue实现上传图片添加水印

    这篇文章主要为大家详细介绍了vue实现上传图片添加水印,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • vue结合leaflet实现热力图

    vue结合leaflet实现热力图

    本文主要介绍了vue实现热力图,结合leaflet.heat插件可以很容易的做出热力图,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论