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 只能捕获同步运行时错误

它对语法错误、异步错误(如 setTimeoutPromise 中抛出的异常)、事件回调里的错误、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.onerrorwindow.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虚拟机安装与调优  重庆市网站制作公司,重庆招聘网站哪个好?