简介: 为了提升应用稳定性,我们对前端项目开展了脚本异常治理的工作,对生产上报的js error进行了整体排查,试图通过降低脚本异常的发生频次来提升相关告警的准确率,结合最近在这方面阅读的相关资料,尝试阶段性的做个总结,下面我们来介绍下js异常处理的一些经验。
作者 | 肖荣强(路迁)
来源 | 阿里开发者公众号
写在前面
为了提升应用稳定性,我们对前端项目开展了脚本异常治理的工作,对生产上报的js error进行了整体排查,试图通过降低脚本异常的发生频次来提升相关告警的准确率,结合最近在这方面阅读的相关资料,尝试阶段性的做个总结,下面我们来介绍下js异常处理的一些经验。
先说概念
什么是异常
先来看一下官方的定义:
Error objects are thrown when runtime errors occur. The Error object can also be used as a base object for user-defined exceptions.
描述的很简单,我们总结一下就是代码在执行过程中遇到了问题,程序已经无法正常运行了,Error对象会被抛出,这一点它不同于大部分编程语言里使用的异常对象Exception,甚至更适合称之为错误,应该说事实也确实如此,Error对象在未被抛出时候和js里其他的普通对象没有任何差别是不会引发异常的,同时Error 对象也可用于用户自定义错误的基础对象。
看下面两个例子:
↓↓↓执行结果↓↓↓
结论:只有在执行过程中的异常可以被捕获,语法解析阶段的异常或者不在当前同步任务中的异常都无法被捕获。
↓↓↓执行结果↓↓↓
以上红色信息里包含了异常信息(message)和栈跟踪(stack trace)信息,对于定位代码中的问题起到重要作用,可以看到栈跟踪是从底部文件位置21:15到顶部25:7位置的;前两个console在遇到异常时候未被执行,第二个script标签内的代码被正常执行。
结论:当任务执行过程中出现未处理的异常,会一直沿着调用栈一层层向外抛出(有点像事件冒泡),最终会导致当前任务被终止执行。当前任务终止后JS 线程会继续从任务队列中提取下一个任务继续执行。
异常的类型
错误名 | 描述 | 示例 |
EvalError | 关于 eval [1]函数的错误,已不在当前ECMAScript规范中使用,不再会被运行时抛出。 | throw new EvalError('EvalError', 'file.js', 10); // 可以由业务代码主动抛出 |
RangeError | 值不在允许的范围内,典型的是试图传递一个数值给一个范围内不包含该数值的函数,此时应该引发RangeError。 | const numObj = 123;numObj.toFixed(-1); // Uncaught RangeError: toFixed() digits argument must be between 0 and 100 at Number.toFixed |
ReferenceError | 当一个不存在(或尚未初始化)的变量被引用时发生的错误。 | const a = undefinedVariable; // Uncaught ReferenceError: undefinedVariable is not defined |
SyntaxError | 解析代码阶段,发现了不符合语法规范的代码。 | const 111variable = 1; // Uncaught SyntaxError: Invalid or unexpected token |
TypeError | 类型错误,用来表示值的类型是非预期类型。 | const a = null;a.doSomeThing(); // Uncaught TypeError: Cannot read properties of null (reading 'doSomeThing') |
URIError | 使用URI处理函数产生的错误 | decodeURIComponent('%') // U |
点击链接查看原文,获取更多福利!
https://developer.aliyun.com/article/1058117?groupCode=alitech?utm_content=g_1000361548
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。