ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

浅谈前端异常监控平台实现方案

2021-06-25 20:01:43  阅读:146  来源: 互联网

标签:浅谈 前端 try finally 监控 catch 日志 异常 捕获


异常捕获是改善软件质量的跟踪手段之一,常见的方式是记录日志,从日志分析异常问题进而跟进。对于前端项目来说,异常可能是后端接口数据导致,可能是前端本身业务逻辑问题导致,不管是什么导致的异常,只要能够精准的捕获到就能够分析出问题所在。可能有小伙说有测试阶段,全面的测试机制的确能够降低异常的出现,但是测试大部份情况是在非生产环境上进行的,覆盖面有限。

日志是收集异常的最佳方式,一个异常监控平台就需要包括异常采集、异常存储、异常统计与分析、异常报告、异常告警,而对于一个通用平台来说,就需要项目管理、版本管理、团队管理、仓库管理等等。本文主要介绍一下异常采集需要考虑的问题,并跟大家分享两种现成的解决方案。

 

异常介绍

异常,是每种编程语言都需要考虑的一种结构,如何友好的跟踪异常而不影响生产环境上的业务,这就需要从项目开发到上线整个过程做一定的规范。下面就来谈谈前端的异常及处理方式。

异常分类

先来说说JavaScript的错误类型,ECMA-262 定义了 7 种错误类型,说明如下:

Error:普通异常,通常与 throw 语句和try/catch 语句一起使用,利用属性 name 可以声明或了解异常的类型,利用message 属性可以设置和读取异常的详细信息。
EvalError:Eval 函数执行异常。
SyntaxError:语法解析不合理,即语法错误。
RangeError:在数字超出合法范围时抛出,比如数组下标越界就会报这种错误。
ReferenceError:在读取不存在的变量时抛出,比如没定义变量 a,后面却使用这个变量 a,就会报这种错。
TypeError:当一个值的类型错误时抛出该异常,比如传递给函数的参数与预期的不符,就会报这种错误。
URIError:以一种错误的方式使用全局 URI 处理函数而产生的错误

异常处理

前端捕获异常分为全局捕获和单点捕获。全局捕获代码集中,易于管理;单点捕获作为补充,对某些特殊情况进行捕获,但分散,不利于管理,容易遗漏。在项目开发过程中,定义一个错误捕获模块,将项目所有的异常(全局异常和单点异常)都交给错误模块来统一处理,这就需要项目约定。

try-catch

try-catch 语句,是 JavaScript 处理异常的一种标准方式。基本语法如下:

try {
    
} catch (error) {
    // 错误处理
}

try 块中的代码发生了错误,就会立即退出代码执行过程,然后执行 catch 块。catch 块会接收到一个包含错误信息的对象。一般是error.message。

finally

finally 在 try-catch 语句中是可选的,如果 finally 子句已经使用,则其代码无论如何都会执行。无论 try 或 catch 语句块中包含什么代码——甚至 return 语句,都不会阻止 finally 子句的执行。只要代码中包含 finally 子句,那么无论 try 还是 catch 语句块中的 return 语句都将被忽略。因此,在使用 finally 子句之前,一定要非常清楚想让代码怎么样。看下面这个函数:

const errorHelper = () => {
    try {
        return devpoint;
    } catch (error) {
        return "error";
    } finally {
        return "不管有无错误,我都执行了!";
    }
};
console.log(errorHelper());  // 函数本身是发生了异常,但是最终打印的结果为:不管有无错误,我都执行了!

上面的函数代码实际上是有异常的,因为变量 devpoint 并没有定义,不过最终执行了 finally 子句输出了 不管有无错误,我都执行了!。

throw

与 try-catch 语句相配的 throw 操作符,用于随时的主动抛出自定义错误。

const errorHelper = () => {
    try {
        return devpoint;
    } catch (error) {
        return "error";
    } finally {
        throw new Error("devpoint变量未定义");
    }
};
console.log(errorHelper());
window.onerror

window.onerror,是全局异常捕获,对于单点异常捕获不到的异常就到这里了。

https://www.98891.com/article-21-1.html

异常采集

触发异常有很多原因,为了更好的分析,除了捕获程序的错误信息外,还需要采集执行程序的外部环境,对于前端项目,外部环境就包括系统(Window、IOS、Android)和系统版本、浏览器(Chrome、IE、火狐等)和版本、IP地址、用户信息、运行的页面、网络环境、API接口数据。针对这些信息就需要设计采集的日志结构。

在采集异常日志的时候,有个原则需要注意:采集日志行为不影响用户体验及应用本身的性能

下面是一个参考的日志结构:

projectId:项目信息
eventId:事件ID,日志的唯一标志
stack:错误stack信息
requestId:开发者定义的异常标志
level:异常级别,可以是 error、info、warn
browser:浏览器信息
device:设备信息
os:操作系统信息
release:应用版本信息
url:异常触发页面url
user:用户信息,可以是iP
createAt:异常产生时间
network:网络信息
eventKey:触发的键
dataRes:API响应数据
screenWidth:屏幕宽度
screenHeight:屏幕高度
message:异常详细信息

 

异常上报

收集到异常数据如何上报呢?即需要将异常日志收集到云端存储,供项目开发跟进分析,一种方式是直接通过API异步上报,在捕获信息比较多的情况下,还是会占用网络请求,影响应用本身。可以考虑将采集的异常日志存储在本地,最佳的选择是IndexedDB,容量大,支持异步操作,可以自定义查询。

IndexedDB 是WEB离线存储的一种方式,因此存储只是暂时的,还需要设计一个同步机制,将本地存储的日志同步到云端服务器上。为了更好的同步,就需要设计暂存区、归档区,新产生的日志存储在暂存区,已成功同步的日志存储在归档区。有了本地存储,同步的过程批量同步。

后端存储,可以考虑使用leveldb,在性能方面,基本可以碾压了mongodb和sqlite。

标签:浅谈,前端,try,finally,监控,catch,日志,异常,捕获
来源: https://www.cnblogs.com/xiaonian8/p/14932355.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有