介: 为了提升应用稳定性,我们对前端项目开展了脚本异常治理的工作,对生产上报的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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
异常的概念:程序在运行过程中出现的错误 (最大的特征:一旦代码出现异常 其后的代码就不再执行)
在js中出现异常后,浏览器会给出一段错误码,就是错误信息,错误消息由错误类型与错误详细点构成
错误类型:
1.Error:error构造函数创建一个错误对象,如果程序运行环境出现错误,就会抛出一个该错误类型的实例对象,除此之外该类型还支持用户自定义错误类型
2.TypeError:如果代码访问的数据类型错误 抛出异常
3.ReferenceError:当访问的变量不存在的时候 抛出异常
4.SyntaxError:当语法错误的时候 抛出异常
5.URIError:当前调用URI相关函数时出现错误 抛出异常
6.EvalError:当非法调用eval函数的时候 抛出异常
7.RangeError:当数组等类型的方位非法使用的时候 抛出异常
##如何处理异常
就是要出现异常后 还能继续执行
常见的异常有两大类:
a.运行环境的多样性
b.代码错误 语法错误
try-catch语法: 即尝试这么做,如果出现错误捕获错误
try{
可能出现错误的代码
}
常概念
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>处理异常</title>
</head>
<body>
</body>
<script>
try{
console.log(abc);
}catch (e) {
console.log('对不起你的代码有错');
console.log(e);
}
var a="正常执行"
console.log(a);
console.log(a);
console.log(a);
console.log(a);
console.log(a);
console.log(a);
</script>
</html>
输出结果
抛出异常代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>抛出异常</title>
</head>
<body>
</body>
<script>
console.log(1);
console.log(2);
try{
o1=new Error('我是一个自定义的抛出异常');
throw o1;
} catch(e) {
console.log( e===o1);
}
console.log(3);
console.log(4);
console.log(5);
console.log(6);
</script>
</html>
输出结果
常见错误:
*请认真填写需求信息,我们会在24小时内与您取得联系。