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

更新日期: 2021-07-26阅读: 1.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://www.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版本更新问题导致的;

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

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

js异步错误捕获

我们都知道 try catch 无法捕获 setTimeout 异步任务中的错误,那其中的原因是什么。以及异步代码在 js 中是特别常见的,我们该怎么做才比较?

不能执行已释放Script的代码

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

JS错误处理:前端JS/Vue/React/Iframe/跨域/Node

js错误的实质,也是发出一个事件,处理他,error实例对象message:错误提示信息,name:错误名称(非标准属性)宿主环境赋予

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

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

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

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

Web前端开发,必须规避的8个错误点!

现在,有越来越多所谓的“教程”来帮助我们提高网站的易用性。我们收集了一些在Web开发中容易出错和被忽略的小问题,并且提供了参考的解决方案,以便于帮助Web开发者更好的完善网站。

web前端错误监控

为什么要做前端错误监控?1. 为了保证产品的质量2. 有些问题只存在于线上特定的环境3. 后端错误有监控,前端错误没有监控,前端错误分为两类: 即时运行错误和资源加载错误

自定义错误及扩展错误

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

点击更多...

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