飞雪连天射白鹿,笑书神侠倚碧鸳

0%

js异常捕获

try catch/Promise 如何捕获运行时异常

try catch

能捕捉到的异常必须是线程执行已经进入 try catch, 但 try catch 未执行完时抛出的异常

try catch的执行周期

执行前 不能捕捉异常

语法异常(syntaxError)在语法检查阶段报错,未进入 try catch

1
2
3
4
5
try{
a.
}catch(e){
console.log("error",e);
}

执行中 能捕捉到异常

1
2
3
4
5
try{
a.b
}catch(e){
console.log("error",e);
}

执行后 不能捕捉异常

线程已经执行完

1
2
3
4
5
try{
setTimeout(()=>{a.b},1000)
}catch(e){
console.log("error",e);
}

Promise

catch

try catch 无法捕捉 Promise 的异常,用Promise.prototype.catch
同步和异步的 Promise 异常都是由 reject 和 Promise.prototype.catch 来捕获

因为 Promise 在执行回调中都用 try catch 包裹起来了,所有的异常都被内部捕获到了,并未往上抛异常,因此在外层的 try catch 看来没有异常

unhandledrejection

通过监听unhandledrejection事件,可以捕获未处理的Promise错误

1
2
3
4
window.addEventListener('unhandledrejection', event => {
console.log(event.reason);
});
Promise.reject('gg');

rejectionhandled

当一个Promise错误最初未被处理,但是稍后又得到了处理,则会触发rejectionhandled事件

1
2
3
4
5
6
7
8
9
10
window.addEventListener('rejectionhandled', event =>{
console.log('rejection handled');
})
function foo(){
return Promise.reject('gg');
}
var f = foo();
setTimeout(() =>{
f.catch(e =>{});
}, 1000);
听说,打赏我的人最后都找到了真爱
↘ 此处应有打赏 ↙
// 用户脚本