一种Vue应用程序错误/异常处理机制

更新日期: 2021-07-26 阅读: 2k 标签: 错误

现在构建前端应用程序不像以前那么简单,现在,应用程序更加复杂和多样。这就需要在构建前端应用程序的时候考虑很多,错误/异常处理是最重要的方面之一。在应用程序中拥有良好的错误处理机制可以带来很多的好处,如下:

  • 良好的错误处理机制可以避免应用程序在出现未处理的异常时崩溃
  • 在生产环境下,可以轻松地存储或者跟踪错误记录日志,以便异常的处理
  • 可以统一处理错误信息,例如在不破坏应用程序交互的情况下,更改错误信息展示UI
  • 有助于改善用户体验

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

  • 语法错误:使用了一些错误的语法
  • 运行时错误:由于执行期间的非法操作导致的
  • 逻辑错误:由于程序逻辑错误
  • 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 类引用到上面的全局配置的处理方法中,如下:

import 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


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/10588

相关推荐

解决Cannot read property range of null 错误

vue工程npm run serve/start/dev启动时,node_modules文件报:Cannot read property range of null 错误,该问题是babel-eslint版本更新问题导致的;

开始使用Vue 3时应避免的10个错误

Vue 3 稳定已经有一段时间了。许多代码库正在生产中使用它,其他人最终也必须进行迁移。我有机会与它一起工作,并记录了我的错误,这可能是你想避免的。

HTTP 400 错误 - 请求无效 (Bad request)

在ajax请求后台数据时有时会报 HTTP 400 错误 - 请求无效 (Bad request);出现这个请求无效报错说明请求没有进入到后台服务里;原因:前端提交数据的字段名称或者是字段类型和后台的实体类不一致

nodejs提示 cross-device link not permitted, rename 错误解决方法

文件上传的功能时候,调用fs.renameSync方法错误,这个提示是跨区重命名文件出现的权限问题。先从源文件拷贝到另外分区的目标文件,然后再unlink,就可以了。

Js中使用innerHTML的缺点是什么?

如果在JavaScript中使用innerHTML,缺点是:内容随处可见;不能像“追加到innerHTML”一样使用;innerHTML不提供验证,因此我们可能会在文档中插入有效的和破坏性的HTML并将其中断

javascript如何抛出错误?

throw语句用来抛出一个用户自定义的异常。当前函数的执行将被停止(throw之后的语句将不会执行),并且控制将被传递到调用堆栈中的第一个catch块。如果调用者函数中没有catch块,程序将会终止。

解决typescript Cannot redeclare block-scoped variable

没有依赖框架来写typescript,纯粹新建一个ts文件,使用tsc编译成js后,ts文件里的声明的变量、函数名都会报错:其实我们写的ts代码是没有问题的,只是ts会对我们声明的变量、具名函数、class都放在了全局作用域

不能执行已释放Script的代码

父页面初始化声明变量a为数组(数组对象是引用类型,赋值传递的是地址),创建iframe子页面后给父页面变量a赋值,赋值后销毁iframe子页面,再次调用变量a的时候就会抛出异常‘SCRIPT5011:不能执行已释放Script的代码’。

避免那些可恶的cannot read property of undefined 错误

Uncaught TypeError: Cannot read property foo of undefined. 是一个我们在 JavaScript 开发中都遇到过的可怕错误。或许是某个 API 返回了意料外的空值,又或许是其它什么原因,这个错误是如此的普遍而广泛以至于我们无法判断

自定义错误及扩展错误

当我们在进行开发的时候,通常需要属于我们自己的错误类来反映任务中可能出现的特殊情况。对于网络操作错误,我们需要 HttpError,对于数据库操作错误,我们需要 DbError,对于搜索操作错误,我们需要 NotFoundError,等等

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!