整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

javascript 异常处理的一些经验

javascript 异常处理的一些经验

介: 为了提升应用稳定性,我们对前端项目开展了脚本异常治理的工作,对生产上报的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>

输出结果

常见错误: