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

  • 语法错误:使用了一些错误的语法
  • 运行时错误:由于执行期间的非法操作导致的
  • 逻辑错误:由于程序逻辑错误
  • 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. 日常工作中需要避免的9个React坏习惯

    前言 React是前端开发领域中最受欢迎的JavaScript库之一,但有时候在编写React应用程序时,可能陷入一些不佳的习惯和错误做法.这些不佳的习惯可能导致性能下降.代码难以维护,以及其他问题. ...

  2. [oeasy]python0141_自制模块_module_reusability_复用性

    自制包内容 回忆上次内容 上次导入了外部的py文件 import my_module 导入一个自己定义的模块   可以使用my_module中的变量 不能 直接使用 my_module.py文件中的变 ...

  3. oeasy教您玩转vim - 36 - # 插入字符

    ​ 插入字符 回忆上节课内容 正则表达式 行头行尾 ^ 意味着行开头 $ 意味着行结尾 任意字符 . 代表任意字符 [a-z] 代表任意小写字母 字符数量 * 代表 0 到任意多个前字符 + 代表 1 ...

  4. 适用于 .NET 的现代化、流畅、可测试的HTTP客户端库

    前言 今天大姚给大家分享一个.NET开源(MIT License).免费.现代化.流畅.可测试.可移植的URL构建器和HTTP客户端库:Flurl. 项目介绍 Flurl是一个集现代性.流畅性.异步性 ...

  5. 关于c++出现的易错问题

    比如我一个对象,经常操作用的指针ptr,原生指针比如ClassA* ca =; 但是我要保存ca,在另一个地方操作,比如: cb =ca; 这样子是不行的,因为我要操作的是ca,而不是ca的值,为什么 ...

  6. 文件系统(十):一文看懂 UBI 文件系统

    liwen01 2024.07.21 前言 UBI (Unsorted Block Images)文件系统是一种用于裸 flash 的文件系统管理层.它是专为管理原始闪存设备而设计,特别适用于嵌入式系 ...

  7. 使用 useRequestURL 组合函数访问请求URL

    title: 使用 useRequestURL 组合函数访问请求URL date: 2024/7/26 updated: 2024/7/26 author: cmdragon excerpt: 摘要: ...

  8. 安卓开发 StateListDrawable 应用

    基础部份     StateListDrawable 安卓开发中,如果要做一个按扭按下改变背景,或获取焦点改变背景,最简单的方法是利用将背景指向一个资源,然后果在资源中配置事件,总共分为三步, 1)  ...

  9. 【PhpAdmin】小皮面板配置PhpAdmin

    1.先用面板开启MySQL和Apache服务 2.MySQL的端口不在3306,我改为3307 3.新建一个站点,声明域名和端口配置 没有配置本地域名映射,这个域名就没有什么用,还是依靠localho ...

  10. 【Linux】00 Docker下载安装(CentOS8)

    官方安装文档: https://docs.docker.com/engine/install/centos/ 先全部卸载Docker有无关系的一些环境 [保证一个干净的部署环境] sudo yum r ...