【转】一种Vue应用程序错误/异常处理机制
在前端应用程序中,最常见的错误/异常类型可能包括以下几种:
- 语法错误:使用了一些错误的语法
- 运行时错误:由于执行期间的非法操作导致的
- 逻辑错误:由于程序逻辑错误
- 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 stackvm:发生错误的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应用程序错误/异常处理机制的更多相关文章
- 分享知识-快乐自己:Spring中的(三种)异常处理机制
案例目录结构: Web.xml 配置: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application ...
- java程序错误类型及异常处理
一.程序的错误类型 在程序设计中,无论规模是大是小,错误总是难免的.程序的设计很少有能够一次完成,没有错误的(不是指HelloWorld这样的程序,而是要实现一定的功能,具备一定实用价值的程序),在编 ...
- 程序错误通常有2种,一种是运行时错误,这种错误ide会抛出异常,我们可以根据异常寻找问题.
1.程序错误通常有2种,一种是运行时错误,这种错误ide会抛出异常,我们可以根据异常寻找问题. 2.可以根据异常寻找问题. 3.可以根据异常寻找问题
- 黑马程序员——JAVA基础之异常处理机制
------- android培训.java培训.期待与您交流! ---------- 异常:就是程序在运行时出现不正常情况. 异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式 ...
- [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开
一.程序错误 编译错误,即语法错误.程序就无法被生成运行代码. 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数 ...
- php错误处理和php异常处理机制
php错误处理 当我们开发程序时,有时候程序出现了问题,我们就可以用以下几种办法找出错误. 开发阶段:开发时输出所有的错误报告,有利于我们进行程序调试 运行阶段:我们不要让程序输出任何一种错误报 ...
- 成C++应用程序世界------异常处理
一. 概述 C++自身有着很强的纠错能力,发展到现在,已经建立了比較完好的异常处理机制.C++的异常情况无非两种,一种是语法错误,即程序中出现了错误的语句,函数,结构和类,致使编译程序无法进行.还有一 ...
- ThinkPHP5.0源码学习之注册错误和异常处理机制
在base.php文件中,用一句代码\think\Error::register();实现错误和异常处理机制的注册. // 注册错误和异常处理机制 \think\Error::register(); ...
- python 全栈开发,Day30(纸牌游戏,异常和错误,异常处理)
一.纸牌游戏 ...
- C错误异常处理,异常处理
预处理器标识#error的目的是什么啊? 指令 用途 # 空指令,无任何效果 #include 包含一个源代码文件 #define 定义宏 #undef 取消已定义的宏 #if 如果给定条件为真,则编 ...
随机推荐
- Python潮流周刊的优惠券和精美电子书(EPUB、PDF、Markdown)
Python潮流周刊从 2023.05.13 连载至今,本周即将发布第 60 期,这意味着我们又要达成一个小小的里程碑啦! 每周坚持做分享,周复一周,这对自己的精力和意志是一项不小的挑战.于是,为了让 ...
- Java的TimeStamp
Java的TimeStamp 很简单,我们可以这样声明 Timestamp ts=new Timestamp(new Date().getTime());这样我们就可以得到时间比较具体的一个类型转换! ...
- python tkinter | 如何使得entry文本框靠右显示,从右向左填充,显示文本末尾
from tkinter import * from tkinter import filedialog app = Tk() app.title("ABC") app.geome ...
- Vue3 之 reactive、ref、toRef、toRefs 使用与区别,源码分析详细注释
目录 reactive.ref.toRef.toRefs 使用与区别 reactive ref 作用及用法 toRef 作用及用法 toRefs 作用及用法 ref,toRef,toRefs 源码实现 ...
- oeasy 教您玩转 linux 010207 黑客帝国 matrix
我们来回顾一下 上一部分我们都讲了什么? 蒸汽机车sl 变身小机车-l 变身飞天机车-F 让我们再开一次车 sl 上次还想看看黑客帝国来着?! 黑客帝国Matrix apt search matrix ...
- Pycharm+pytest+allure打造高逼格的测试报告
环境前置提示:allure是基于Java的一个程序,需要Java1.8的环境,没有安装需要去安装一下. 如果在cmd中能输入java,获取到命令信息则不管,否则需要配置系统变量: 路径:计算机> ...
- appium模拟键盘事件
原方法: 1 def press_keycode(self, keycode, metastate=None): 2 """Sends a keycode to the ...
- electron安装成功记录
1.登录官网查看当前最新版本对应的node,注意这里不要看php那个汉化的,他那个是老版本的,node对不上 2.nvm安装一个新的node 3.使用cnpm安装(npm安装还是报错了,记得删node ...
- 写写Redis十大类型zset的常用命令
其实这些命令官方上都有,而且可读性很强,还有汉化组翻译的http://redis.cn/commands.html,不过光是练习还是容易忘,写一写博客记录一下 从zset类型开始写||zset类型适合 ...
- 【Vue】el-select 数据过多替代方案
一.需求问题: 一开始就考虑使用简单el-select选取数据,但是后面数据量增多, 超过一千条开始,组件会很卡不好用,第二个是接口也慢了 数据量多的话是有一个filterable做支持了,可以输入关 ...