【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 |
|