1.异常
1)常见错误类型
- RangeError,一是数组长度为负数,二是Number对象的方法参数超出范围,以及函数堆栈超过最大值
- ReferenceError,当引用未声明的变量时发生
- SyntaxError,解析时发生语法错误
- TypeError,当值不是所期待的类型时,
null.f()
也报这个错 - URIError,当传递一个非法的URI给全局URI处理函数时发生,如
decodeURIComponent('%')
,即decodeURIComponent
,decodeURI
,encodeURIComponent
,encodeURI
举几个🌰,并没有按循序举🌰。(部分情况)
1.TypeError
2.ReferenceError
3.URIError
4.SyntaxError(这里因为大写的符号)
5.RangeError
2)异常出现的特点
异常的出现不会直接导致 JS 引擎崩溃,最多只会使当前执行的任务终止。
1 |
|
当前代码块将作为一个任务压入任务队列中,JS 线程会不断地从任务队列中提取任务执行。
当任务执行过程中出现异常,且异常没有捕获处理,则会一直沿着调用栈一层层向外抛出,最终终止当前任务的执行。
JS 线程会继续从任务队列中提取下一个任务继续执行。
可以看到,第一个script
标签下没有打印出来
2.三种监听报错的方式
脚本错误一般分为两种:语法错误,运行时错误。
1)try … catch…
即时运行错误一般使用try … catch…
1 | try{ |
try … catch…几种无法捕获的情况
一般语法错误,就被编译器发现了
1 | try { |
异步错误
1 | try { |
2)window.onerror = function(msg, url, line, col, error){}
它有5个参数,分别是:
1 | * @param {String} errorMessage 错误信息 |
它可以监听异步报错
1 |
|
可以看到
当然它也有它的问题
如果我监听的事件,写在同步事件报错之后,就无法被监听到
1 |
|
可以看到
图片404请求的时候
1 |
|
可以看到
3)window.addEventListener(‘error’,function(err){})
效果与上面一个相同,不过上面那个比较好用。
3.错误上传
写个简单的🌰(省略了很多判断)
1 |
|
Koa:
1 | const Koa = require('koa'); |
可以看到请求
还可以看到后台打印出的结果
4.补充一下遇到过的问题
1)localStorage存满了的报错
公司app在登陆页的时候白屏,最后猜测可能是localStorage存满了,导致报错。
写个一直往缓存里存数据,致使报错的🌰。
1 |
|
在浏览器上调试会抓到报错
然鹅我们的错误上传却没有这个错误。最后我尝试着使用window.addEventListener('error',function(err){})
抓取这个报错,判断code为22,并且name为QuotaExceededError的时候,把缓存里必须的数据保存下来,删除其他无用的缓存。在浏览器调试正常,在真机调试的时候确抓不到这个报错。
2)script error
经常引入外部的脚本报错,确看不到具体的报错信息。
写个简单的🌰,页面error.html
启在8000端口,后端使用koa,启在8001端口,error.html
加载8001端口的脚本。关于跨域
error.html
1 |
|
Index.js
1 | const Koa = require('koa'); |
error.js
1 | var a = 2; |
于是可以看到报错信息
script error
: 是浏览器在同源策略限制下产生的,浏览器处于对安全性上的考虑,当页面引用非同域名外部脚本文件时中抛出异常的话,此时本页面是没有权利知道这个报错信息的,取而代之的是输出 script error
这样的信息。
解决方案:script
标签内添加crossOrigin
error.html
1 |
|
于是可以看到具体的报错信息