【javaScript】异常处理

异常处理

相关文章

异常处理


一、try-catch 块

使用 try 和 catch 关键字可以捕获代码块中的异常,并执行相应的错误处理逻辑。

限制和条件

  • 同步代码块

    try-catch 块只能捕获同步代码块中抛出的异常,无法捕获异步代码块中的异常。例如,无法捕获 Promise 中的异常,或者由 setTimeout/setInterval 等函数延迟执行的代码块中的异常。

  • 词法范围限制

    try-catch 块只能捕获在其词法范围内抛出的异常。如果异常在其外部词法范围中抛出,try-catch 块将无法捕获到。

  • 语法正确

    try-catch 块内的语法必须是正确的,否则会导致语法错误,并且无法捕获该错误。因此,建议在 try-catch 块中放置可能引发异常的代码。

  • 异常处理逻辑

    catch 块中的代码块应当能够处理捕获到的异常,并提供适当的错误处理逻辑。否则,异常可能会被传递到上层调用栈,最终导致程序崩溃。

二、全局异常捕获

可以使用 window.onerror(在浏览器环境)或者 process.on(‘uncaughtException’)(在 Node.js 环境)来捕获未被捕获的全局异常。

限制和条件

  • 不能捕获所有类型的异常

    window.onerror 无法捕获所有类型的异常,尤其是一些关键错误,例如跨域脚本加载错误、某些浏览器扩展中的错误、资源加载失败等。这些错误会被浏览器屏蔽,不会触发 window.onerror 事件。

  • 浏览器安全策略的限制

    一些浏览器安全策略可能会限制 window.onerror 的行为,例如 CSP(Content Security Policy)可能会限制报告异常的行为。

  • 有限的错误信息

    window.onerror 提供的错误信息有限,通常只包含错误消息、错误来源、行号和列号等信息,不够详细。

  • 异步代码的限制

    window.onerror 无法捕获异步代码中的异常,例如 Promise 中的异常或者延迟执行的代码中的异常。

三、Promise 捕获异常

可以通过 Promise 对象的 catch() 方法来捕获异步操作中的异常。

限制和条件

  • 同步代码块

    Promise 对象的 catch() 方法只能捕获异步操作中的异常,无法捕获同步代码块中的异常。因此,如果在 Promise 对象中的同步代码块中抛出异常,需要额外的 try-catch 块来捕获。

  • Promise 链中的限制

    catch() 方法只能捕获到其之前的 Promise 对象链中抛出的异常。如果在 catch() 方法之后的 Promise 对象中抛出异常,那么该异常将无法被 catch() 方法捕获到。

  • 未处理的 Promise 拒绝

    如果 Promise 对象被拒绝但未被任何 catch() 方法处理,那么该拒绝的异常将会成为一个未捕获的全局异常。这会导致在控制台中显示未捕获的 Promise 拒绝错误信息。

  • 内部异常处理逻辑

    在 Promise 链中,如果异常已经在之前的 Promise 对象中被捕获并处理,那么后续的 Promise 对象将不会再处理该异常。这意味着如果前面的 Promise 对象已经成功处理了异常,那么后续的 catch() 方法将不会被触发。

  • 异步代码的限制

    Promise 对象的 catch() 方法无法捕获异步代码块中的异常,例如在 Promise 的 then() 方法中的回调函数中抛出的异常,或者在 setTimeout/setInterval 中延迟执行的代码中抛出的异常。

四、如何捕获异常代码中的异常

对于延迟执行的异步操作,例如可以在 setTimeout/setInterval 函数中使用 try-catch 块来捕获异常。例如:

1
2
3
4
5
6
7
8
setTimeout(() => {
try {
// 异步操作
} catch (error) {
// 捕获并处理异步操作中的异常
console.error(error);
}
}, delay);

喜欢这篇文章?打赏一下支持一下作者吧!
【javaScript】异常处理
https://www.cccccl.com/20210505/javascript/异常处理/
作者
Jeffrey
发布于
2021年5月5日
许可协议