# 前端中经常出现的错误及捕获
# 1.例子 1
html 中第一个 script 标签对 报错 第二个 script 标签对能够输出
<script>
error
console.log(1)
</script>
<script>
//能输出,独立的script是一个独立的代码段,不影响
console.log(2)
</script>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2.例子 2
try catch 可以捕获到错误
try {
err
var er = "error"
// 遇到语法错误影响会退出, 不会执行
} catch (error) {
console.log(error)
}
1
2
3
4
5
6
7
2
3
4
5
6
7
但是看下面例子 var er = "error 语法错误呢
try {
var er = "error
// 遇到语法错误影响会退出, 不会执行
} catch (error) {
console.log(error)
}
1
2
3
4
5
6
7
2
3
4
5
6
7
输出会直接报错,为什么呢,语法错误了,引擎退出,js 不执行了,所以捕获不到
再看看下面的例子,try 捕获异步的错误
<script>
try {
setTimeout(() => {
err
}, 1000)
} catch (error) {
console.log(error)
}
</script>
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
但是很遗憾捕获不到,所以总结 try catch 处理异常的能力有限,只能捕捉到同步的错误,但是语法错误,异步捕获不到。
##3.例子 3
根据上面异步错误捕获不到,那谁能够捕获到异步的错误呢,接下来看下面的代码
window.onerror = function(msg, url, row, col, err) {
console.log('我已经捕获到错误')
console.log(msg, url, row, col, err)
return true
}
try {
setTimeout(() => {
err
}, 1000)
} catch (error) {
console.log(error)
}
err
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
根据 window.onerror 可以具体捕获到同步与异步的错误信息。
那么我们在看一段代码
<img src="xxx.png" alt="">
window.onerror = function(msg, url, row, col, err) {
console.log('我已经捕获到错误')
console.log(msg, url, row, col, err)
return true
}
1
2
3
4
5
6
2
3
4
5
6
资源加载报错,捕获不到
总结 1.try catch 可以捕获到意料之内的错误,
2.window.onerror 可以捕获到意料之外的错误
3.window.onerror 必须返回 true ,异常会向上抛出
4.当遇到 资源加载时报错,也捕获不到
# 4.例子 4
根据上述例子捕获不到资源加载时错误,可以使用下面的例子
<img src="xx.png" alt="">
<script>
window.addEventListener('error', (msg, url, row, col, err) => {
console.log(msg, url, row, col, err)
return false
}, true)
//事件捕获
</script>
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 5.例子 5
那么遇到 throw 和 reject 呢
window.addEventListener('unhandledrejection', (e) => {
e.preventDefault()
console.log(e.reason)
})
Promise.reject('xxx')
1
2
3
4
5
2
3
4
5
# 6.例子 6
NodeJS 里程确实有“脆弱”的一面,单线程的某处产生了“未处理的”异常确实会导致整个 Node.JS 的崩溃退出,来看个例子, 这里有一个 node-error.js 的文件:
var http = require('http');
var server = http.createServer(function (req, res) {
//这里有个错误,params 是 undefined
var ok = req.params.ok;
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World
');
});
server.listen(8080, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8080/'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
启动服务,并在地址栏测试一下发现 http://127.0.0.1:8080/ 不出所料,node 崩溃了
使用 uncaughtException
process.on('uncaughtException', function (err) {
//打印出错误
console.log(err);
//打印出错误的调用栈方便调试
console.log(err.stack);
});
1
2
3
4
5
6
2
3
4
5
6