当发生错误时,JS通常会停止并抛出异常(Error对象),该对象带有两个属性name
和message
。
try catch finally
即使程序发生错误,也不会中断执行。
- 当
try
中出错时,try
的后续代码不会执行,而是直接进入catch
-
finally
可以省略 - 使用
try
包裹的代码,即使不出错,效率也比不用try
包裹的代码低
try{
可能发生错误的代码
}catch(err){
只有发生错误时才执行的代码
}finally{
无论是否出错,肯定都要执行的代码
}
try catch finally 中的 return
-
try
/catch
/finally
中执行return
时,不但阻止其自身后续逻辑,还会阻止try catch finally
后的代码继续执行 - 当
finally
存在时,即使try
/catch
中存在return
,finally
也依然会执行 - 如
try
、catch
、finally
同时存在return
,则finally
的return
生效
throw
throw
语句允许主动抛出一个错误,通过与 try
和 catch
一同使用,就可以控制程序流并生成自定义错误消息。
异步的错误处理
try
只能监听同步逻辑的执行,当异步抛出错误时,应在异步方法内另外使用错误处理。
同理,在Promise的函数体内,只有 同步方法出错 / 同步throw 才会进入onRejected逻辑,异步方法内只能通过调用reject进入onRejected
可以通过 await
把异步变成同步,来使try
监听错误:
(async function () {
try {
await Promise.reject(100);
console.log(200);
} catch (error) {
console.log("error", error);
}
console.log(300);
})();
输出结果:
error 100
300
onerror
抛出的错误都可以被window.onerror
事件捕捉到
window.onerror = function (e) {
console.log('window', e)
}
throw new Error("err")