电话
400 9058 355
try-catch仅捕获同步错误,对setTimeout、Promise等异步错误无效;Promise需用.catch或await+try-catch;全局错误用window.addEventListener('error')和'unhandledrejection'监听。
直接说结论:try-catch 对异步代码(比如 setTimeout、fetch、Promise.then)里的错误完全无效。很多人写完 try-catch 还是看到 Uncaught Error,就是因为把异步逻辑塞进了 try 块里,却没意识到执行时机已脱离当前调用栈。
真正能被 try-catch 捕获的,只有「立即执行且抛出异常」的同步代码,比如:
try {
JSON.parse('{ "name": }'); // 语法错误 → 被捕获
} catch (err) {
console.log(err.message); // Unexpected token } in JSON at position 12
}
Promise 的 reject 不会触发外层 try-catch,哪怕它写在 try 块里。这是最常踩的坑。
try {
Promise.reject(new Error('boom'));
} catch (e) {
console.log('never runs');
}.catch):Promise.reject(new Error('boom'))
.catch(err => console.log(err.message));async/await + try-catch):async function run() {
try {
await Promise.reject(new Error('boom'));
} catch (err) {
console.log(err.message); // boom
}
}当错误逃逸到最外层(比如事件回调、定时器、未处理的 Promise reject),try-catch 就无能为力了,这时需要全局监听。
window.onerror 能捕获 JS 运行时错误和资源加载失败(如 script 404),但无法拿到 error 实例的完整堆栈(部分信息被截断);window.addEventListener('error') 类似,但更通用,推荐优先用它;window.addEventListener('unhandledrejection') 单独监听,否则会直接打印 “Uncaught (in promise)” 并终止进程(开发环境尤其明显)。示例:
window.addEventListener('unhandledrejection', event => {
console.warn('Unhandled rejection:', event.reason);
event.preventDefault(); // 阻止控制台默认报错(仅开发调试时慎用)
});
不是所有地方都适合加 try-catch。滥用反而掩盖问题、干扰调试。
localStorage.setItem(可能因配额超限失败)、第三方 SDK 的同步调用(如 analytics.track());a + b)、已知安全的 DOM 操作(如 el.classList.add)、没有 throw 可能的函数;catch 后必须处理错误——至少打日志,否则等于静默吞错;catch (e) { },至少保留 console.error(e) 或上报错误服务。复杂点在于:错误边界往往不

邮箱: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...