在前端应用程序中,最常见的错误/异常类型可能包括以下几种:

  • 语法错误:使用了一些错误的语法
  • 运行时错误:由于执行期间的非法操作导致的
  • 逻辑错误:由于程序逻辑错误
  • Http 错误:API 返回的错误

有很多方法可以解决上面的问题,例如使用 eslint 来检查语法错误,使用适当的 try-catch 语句处理运行时错误,通过适当的单页或者集成测试减少逻辑错误,http 错误可以通过使用 Promise 来处理。

全局配置

Vue 应用程序有一个全局配置 Vue.config,可以配置禁止日志和告警、devtools、错误处理程序等等。

可以用自己的配置覆盖这些配置,对于错误处理,可以为其分配一个处理函数 Vue.config.errorHandler。在整个应用程序中,任何 Vue实例(Vue组件)中的任何未捕获异常都会调用该处理程序。以下代码片段为Vue 应用程序注册一个错误处理方法(一般在项目的 main.js 文件中):

/**
*
* @param {*} error 错误跟踪
* @param {*} vm 组件错误
* @param {*} info 特定的错误信息,如生命周期钩子、事件等。
*/
Vue.config.errorHandler = (error, vm, info) => {
console.info(error);
console.info(vm);
console.info(info);
};

处理程序包含 3 个参数:

  • error:完整的错误跟踪,包含 message 和 error stack
  • vm:发生错误的Vue组件/实例
  • info: 特定的错误信息,例如生命周期钩子、事件等。

Vue.config.errorHandler 捕获特定于Vue实例的错误,但无法捕获 Vue 实例之外的错误,如服务。

要捕获 Vue 实例之外的错误,可以使用 window.onerror 事件,可以注册一个错误处理函数,该函数将捕获所有非特定于 Vue 实例的未处理异常。下面的代码片段为其应用注册window.onerror 异常处理函数:

window.onerror = function(message, source, lineno, colno, error) {
// TODO: 定义跟踪逻辑
};

自定义异常组件

通常项目中有一些可预知的异常需要自定义 UI ,可以自定义异常组件来统一接管异常的处理。实现的逻辑是如果有异常显示异常信息,否则就显示组件信息,代码如下:

<template>
<div>
<slot v-if="errors" name="errors">
<a-alert
:message="errors.title"
:description="errors.description"
show-icon
type="warning"
class="mb-2"
>
</a-alert>
</slot>
<slot v-else></slot>
</div>
</template> <script>
export default {
name: "QtErrorContainer",
props: {
errors: Object, // {title:"500错误",description:"数据库连接超时"}
},
};
</script>

以上面的组件作为容器来加载其他组件,如通过后台接口拉取列表数据,调用如下:

<QtErrorContainer :errors="errors">
<a-table ></a-table>
</QtErrorContainer>

上面的代码在 errors 为 null 或者 false 的时候,显示表格组件 <a-table></a-table>,否则不显示而显示异常信息。这样实现好处就是所有可预知的异常都由统一的组件来处理,提高复用和灵活性。

日志处理

对于日志处理,可以封装为一个独立的类,如 logger ,负责收集Vue中所有的异常日志,输出到控制台或者通过接口发送到服务器存储或借助第三方日志跟踪平台,只需要修改 logger 的处理方式即可,如下:

import { environment } from "@/environment/";

/**
* Logger 日志类
*/
class Logger {
/**
* @constructor AppLogger
*/
constructor() {
this.init();
} init() {
if (environment !== "production") {
this.log = console.log.bind(console);
this.debug = console.debug.bind(console);
this.info = console.info.bind(console);
this.warn = console.warn.bind(console);
this.error = console.error.bind(console);
this.toServer = this.error;
} else {
/** 在生产的情况下,替换函数定义 */
this.log = this.debug = this.info = this.warn = this.error = () => {};
/** TODO: 方法中可以增加接口或者第三方平台跟踪的逻辑 */
this.toServer = (err) => {
console.error(err);
};
}
}
} const logger = new Logger(); export { logger };

可以将 logger 类引用到上面的全局配置的处理方法中,如下:

mport Vue from "vue";
import { logger } from "@/logger";
/**
*
* @param {*} error 错误跟踪
* @param {*} vm 组件错误
* @param {*} info 特定的错误信息,如生命周期钩子、事件等。
*/
Vue.config.errorHandler = (error, vm, info) => {
logger.toServer({ error, vm, info });
}; window.onerror = function (message, source, lineno, colno, error) {
logger.toServer({ message, source, lineno, colno, error });
};

总结

错误处理对于应用程序非常重要,在本文中,讨论了Vue.config.errorHandler 使用生命周期钩子的全局错误处理程序和自定义组件来处理可预知的异常。本文提供了基本细节,借助这些细节,可以轻松实现应用程序的错误处理并记录它们,这将有助于创建更好的用户体验。

原文地址:https://my.oschina.net/lav/blog/5146875

【转】一种Vue应用程序错误/异常处理机制的更多相关文章

  1. 分享知识-快乐自己:Spring中的(三种)异常处理机制

    案例目录结构: Web.xml 配置: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application ...

  2. java程序错误类型及异常处理

    一.程序的错误类型 在程序设计中,无论规模是大是小,错误总是难免的.程序的设计很少有能够一次完成,没有错误的(不是指HelloWorld这样的程序,而是要实现一定的功能,具备一定实用价值的程序),在编 ...

  3. 程序错误通常有2种,一种是运行时错误,这种错误ide会抛出异常,我们可以根据异常寻找问题.

    1.程序错误通常有2种,一种是运行时错误,这种错误ide会抛出异常,我们可以根据异常寻找问题. 2.可以根据异常寻找问题. 3.可以根据异常寻找问题

  4. 黑马程序员——JAVA基础之异常处理机制

    ------- android培训.java培训.期待与您交流! ---------- 异常:就是程序在运行时出现不正常情况. 异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式 ...

  5. [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开

    一.程序错误 编译错误,即语法错误.程序就无法被生成运行代码. 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数 ...

  6. php错误处理和php异常处理机制

    php错误处理  当我们开发程序时,有时候程序出现了问题,我们就可以用以下几种办法找出错误.  开发阶段:开发时输出所有的错误报告,有利于我们进行程序调试  运行阶段:我们不要让程序输出任何一种错误报 ...

  7. 成C++应用程序世界------异常处理

    一. 概述 C++自身有着很强的纠错能力,发展到现在,已经建立了比較完好的异常处理机制.C++的异常情况无非两种,一种是语法错误,即程序中出现了错误的语句,函数,结构和类,致使编译程序无法进行.还有一 ...

  8. ThinkPHP5.0源码学习之注册错误和异常处理机制

    在base.php文件中,用一句代码\think\Error::register();实现错误和异常处理机制的注册. // 注册错误和异常处理机制 \think\Error::register(); ...

  9. python 全栈开发,Day30(纸牌游戏,异常和错误,异常处理)

    一.纸牌游戏                                                                                              ...

  10. C错误异常处理,异常处理

    预处理器标识#error的目的是什么啊? 指令 用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编 ...

随机推荐

  1. opc ua设备数据 转MQTT项目案例

    目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 配置VFBOX网关采集OPC UA的数据 2 5 用MQTT协议转发数据 4 6 配置参数说明 4 7 上报内容配置 5 ...

  2. Django+forms+html

    在Django中,Form类通常通过继承django.forms.Form或django.forms.ModelForm来定义.当你定义一个表单类时,通常使用Form或ModelForm类,并使用各种 ...

  3. XCode 编译 PAG 源码

    最近工作中要使用PAG替换Lottie,为了方便阅读源码,使用XCode对其源码进行了编译. 1 下载源码 编译源码首先要下载源码,有关PAG源码可直接到github上下载. 2 添加相关依赖 下载源 ...

  4. Python 在PDF中添加、替换、或删除图片

    PDF文件中的图片可以丰富文档内容,提升用户的阅读体验.除了在PDF中添加图片外,有时也需要替换或删除其中的图片,以改进视觉效果或更新信息.本文将提供以下三个示例,介绍如何使用Python 操作PDF ...

  5. 绝对要收藏!!! JavaEE开发常用注解

    目录 前言 1.Mybatis常用注解 2.SpringMVC常用注解 3.Spring常用注解 1. IoC注解 2. DI注解 3. 事务注解 4.SpringBoot常用注解 5.Lombok注 ...

  6. signal-slot:python版本的多进程通信的信号与槽机制(编程模式)的库(library) —— 强化学习ppo算法库sample-factory的多进程包装器,实现类似Qt的多进程编程模式(信号与槽机制) —— python3.12版本下成功通过测试

    什么是 Qt signal-slot库项目地址: https://github.com/alex-petrenko/signal-slot 该库实现的主要原理: 要注意这个项目的library只是对原 ...

  7. 强化学习框架chainerrl的安装

    源码地址: https://gitee.com/mirrors_chainer/chainerrl PS: 需要注意的是本文的安装方式并不能支持CUDA,也就是无法使用GPU进行计算:年久失修的计算框 ...

  8. 【转载】 推荐算法之Thompson(汤普森)采样

    原文地址: https://www.cnblogs.com/gczr/p/11220187.html ------------------------------------------------- ...

  9. anaconda运行install命令报错:Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)'

    运行命令: conda install mpi4py 报错: Retrieving notices: ...working... ERROR conda.notices.fetch:get_chann ...

  10. 白鲸开源 DataOps 平台加速数据分析和大模型构建

    作者 | 李晨 编辑 | Debra Chen 数据准备对于推动有效的自助式分析和数据科学实践至关重要.如今,企业大都知道基于数据的决策是成功数字化转型的关键,但要做出有效的决策,只有可信的数据才能提 ...