javascript错误处理怎么做_try...catch能捕获哪些错误?
发布时间 - 2026-01-12 00:00:00 点击率:次try...catch仅捕获同步运行时错误,对语法错误、异步错误(setTimeout/Promise/事件回调)、fetch网络失败(未手动throw)均无效;Promise错误需用.catch()或await+try...catch;全局错误需window.onerror、error事件及unhandledrejection监听。
try...catch 只能捕获同步运行时错误
它对语法错误、异步错误(如 setTimeout 或 Promise 中抛出的异常)、事件回调里的错误、fetch 网络失败(除非你手动 throw)都无能为力。常见误解是以为加了 try...catch 就万事大吉,其实它只管当前执行栈里“立刻跑起来”的那部分代码。
比如下面这段不会被捕获:
try {
setTimeout(() => {
throw new Error('这个错 catch 不到');
}, 0);
} catch (e) {
console.log('永远不会执行这里');
}
原因:setTimeout 的回调在新任务中执行,已脱离原始 try 块的作用域。
Promise 错误必须用 .catch() 或 await 配合 try...catch
Promise 构造函数内部抛错,不会触发外层 try...catch;但用 await 调用时,可以被包裹它的 try...catch 捕获——前提是没漏掉 await 关键字。
- 写法正确(可捕获):
async function fetchUser() { try { const res = await fetch('/api/user'); if (!res.ok) throw new Error(`HTTP ${res.status}`); return await res.json(); } catch (err) { console.error('请求或解析失败:', err.message); } } - 写法错误(不可捕获):
function badExample() { try { fetch('/api/user').then(r => r.json()).catch(e => console.error(e)); // 这里没 await,fetch 是立即返回 Promise,try 块早就结束了 } catch (e) { // 永远进不来 } }
全局错误兜底:用 window.onerror 和 window.addEventListener('error')
它们能捕获未被处理的 JS 错误、资源加载失败(如 )、甚至部分跨域脚本错误(受浏览器策略限制)。但注意:window.onerror 无法拿到 error 实例的完整堆栈(尤其跨域时),而 error 事件监听器更通用些。
推荐组合使用:
window.onerror = function(message, source, lineno, colno, error) {
console.warn('onerror:', { message, source, lineno, colno, error: error?.stack });
return true; // 阻止默认错误提示(可选)
};
window.addEventListener('error', function(e) {
if (e.error) {
console.warn('Error event with error object:', e.error.stack);
} else if (e.target && e.target.src) {
console.warn('Resource load failed:', e.target.src);
}
});
注意:Promise 拒绝未被捕获时,会触发 unhandledrejection 事件,别忘了加监听:
window.addEventListener('unhandledrejection', e => {
console.warn('Unhandled Promise rejection:', e.reason);
e.preventDefault(); // 阻止控制台警告(谨慎使用)
});
实际项目中容易忽略的点
很多团队只加了 try...catch 就以为覆盖全面了,结果线上 still crash。真正要稳住,得盯住这几处:
- 所有
JSON.parse()
必须包 try...catch—— 它是典型的同步运行时错误源,且常出现在响应体解析环节 - 第三方 SDK 的回调(如微信 JS-SDK、地图 API)多数不走 Promise,错误靠传参或事件,不能依赖
await -
addEventListener里的 handler 函数,错误不会冒泡到外层try,需各自加保护 - Vue/React 组件的生命周期或渲染函数出错,会被框架捕获并降级(如 Vue 的
errorCaptured钩子),但自定义逻辑仍要主动防御
错误处理不是加一层 try...catch 就结束的事,关键在判断错误发生的位置和时机——同步?异步?是否在 Promise 链里?有没有跨执行上下文?漏掉任意一种,就可能变成静默失败或白屏。
# vue
# react
# javascript
# java
# js
# json
# 微信
# 浏览器
# 栈
# ai
# win
# 跨域
# 作用域
# red
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
如何在IIS7中新建站点?详细步骤解析
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】
js实现点击每个li节点,都弹出其文本值及修改
EditPlus 正则表达式 实战(3)
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何构建满足综合性能需求的优质建站方案?
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
javascript基本数据类型及类型检测常用方法小结
Laravel如何实现API资源集合?(Resource Collection教程)
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Laravel如何配置和使用缓存?(Redis代码示例)
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
微信小程序 HTTPS报错整理常见问题及解决方案
JavaScript中的标签模板是什么_它如何扩展字符串功能
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
使用spring连接及操作mongodb3.0实例
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
高性能网站服务器部署指南:稳定运行与安全配置优化方案
济南网站建设制作公司,室内设计网站一般都有哪些功能?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
Android滚轮选择时间控件使用详解
手机网站制作与建设方案,手机网站如何建设?
Python文件异常处理策略_健壮性说明【指导】
Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
如何确保西部建站助手FTP传输的安全性?
如何在云主机快速搭建网站站点?
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
LinuxCD持续部署教程_自动发布与回滚机制
佛山网站制作系统,佛山企业变更地址网上办理步骤?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
独立制作一个网站多少钱,建立网站需要花多少钱?
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
如何快速打造个性化非模板自助建站?
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
EditPlus中的正则表达式 实战(2)
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
重庆市网站制作公司,重庆招聘网站哪个好?


必须包