电话
400 9058 355
try...catch仅捕获同步运行时错误,对语法错误、异步错误及未await的Promise拒绝无效;async/await中配合await可捕获Promise拒绝;catch必须带参数;finally总执行,适用于资源清理。
JavaScript 的 try...catch 能捕获运行时错误,但对语法错误、异步错误(如 setTimeout 中抛出的)、Promise 拒绝(reject)默认无效 —— 这是多数人踩坑的起点。
try...catch 有效?它只捕获当前执行栈中同步抛出的错误(throw)或内置异常(如 ReferenceError、TypeError)。
undefined 的属性等setTimeout(() => { throw new Error() })、fetch().catch()、顶层语法错误(如 let x = ;)async/await 函数里用 try...catch 是有效的,因为 await 将 Promise 拒绝转为同步抛出(前提是没被上层 Promise 吞掉)catch 块必须带参数吗?是的。ES2019+ 要求 catch 必须声明错误绑定变量(哪怕不用),写成 catch (err) 或 catch (_) 都可以,但 catch {} 会报语法错误。
try {
JSON.parse('{ "x": }'); // SyntaxError
} catch (err) { // ✅ 必须有参数
console.log(err.message); // "Unexpected token }"
}
finally?什么情况下必须用?finally 在 try 或 catch 执行完后**总会运行**,适合清理资源,比如关闭加载状态、释放锁、重置计时器。
loading = true 放 try 前,loading = false 放 finally 里,确保无论成功失败都收尾finally 替代 catch —— 它不接收错误,也无法阻止错误向上冒泡finally 里也 throw 或返回 Promise 拒绝,会覆盖前面的错误或返回值try...catch?那怎么统一处理?原生 Promise 构造函数内部抛错不会进外层 try...catch;必须显式用 .catch() 或 await + try...catch。
try {
Promise.reject(new Error('nope')); // ❌ 不会被捕获
} catch (e) {
// 永远进不来
}
// ✅ 正确方式 1:链式 .catch()
Promise.reject(new Error('yep')).catch(e => console.error(e));
// ✅ 正确方式 2:await + try
async function f() {
try {
await Promise.reject(new Error('yep'));
} catch (e) {
console.error(e); // 进得来
}
}
全局未捕获 Promise 拒绝可用 wind 监听,但只是兜底,不能替代业务层处理。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...