javascript 异常处理的一些经验

写在前面
为了提升应用稳定性,我们对前端项目开展了脚本异常治理的工作,对生产上报的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(&39;, &39;, 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
【javascript 异常处理的一些经验】类型错误 , 用来表示值的类型是非预期类型 。
const a = null;a.doSomeThing(); // Uncaught TypeError: Cannot read properties of null (reading &39;)
URIError
使用URI处理函数产生的错误
decodeURIComponent(&39;) // U
点击链接查看原文,获取更多福利!
https://developer.aliyun.com/article/1058117?groupCode=alitech?utm_content=g_1000361548
以上就是朝夕生活(www.30zx.com)关于“javascript 异常处理的一些经验”的详细内容,希望对大家有所帮助!

猜你喜欢