javascript错误处理怎样捕获异常?【教程】

发布时间 - 2026-01-31 00:00:00    点击率:
try-catch只捕获同步异常,如throw、TypeError等;异步错误需用async/await或unhandledrejection监听;window.onerror和error事件补全局错误,但Web Worker、跨域iframe等错误无法捕获。

try-catch 能捕获哪些错误?

它只捕获**同步执行中抛出的异常**,比如 throw new Error()、类型错误(TypeError)、引用错误(ReferenceError)等。异步代码(如 setTimeoutfetch、Promise 回调)里直接 throw,不会被外层 try-catch 捕获。

常见误判场景:

  • 写了 try { fetch('/api').then(...)} catch(e) {...} —— 这个 catch 实际捕获不到 Promise 内部错误
  • JSON.parse('invalid') 会触发,但 JSON.parse(undefined) 也会(因为传了非字符串)
  • 箭头函数中忘记写 return,导致意外返回 undefined,后续调用 .mapTypeError: Cannot read property 'xxx' of undefined —— 这类错误能被捕获,但根源在逻辑,不是语法

async/await 怎么配合 try-catch?

这是目前最接近“同步写法捕获异步错误”的方式。关键点:await 必须在 async 函数内,且被 await 的 Promise 被 reject 时,会以异常形式抛出,进 catch 块。

正确写法示例:

async function loadData() {
  try {
    const res = await fetch('/api/users');
    if (!res.ok) throw new Err

or(`HTTP ${res.status}`); const data = await res.json(); return data; } catch (err) { console.error('加载失败:', err.message); // 这里能捕获 fetch 网络失败、JSON 解析失败、手动 throw 的错误 } }

注意:

  • 不要对 fetch 本身加 try-catch 就以为万事大吉 —— 它只拒绝网络级错误(如离线),404500 仍返回成功 Promise,需手动检查 res.ok
  • await Promise.reject(new Error()) 会被捕获;但 Promise.reject() 不 await,就不会

window.onerror 和 window.addEventListener('error') 有什么区别?

它们补的是 try-catch 漏掉的“全局异常”:脚本加载失败、资源加载错误( 404)、未捕获的 Promise rejection、跨域脚本错误(此时 error 信息被浏览器抹为 Script error.)。

实操建议:

  • window.addEventListener('error', handler) 捕获资源加载类错误(如图片、CSS 加载失败),它比 window.onerror 更早触发,且能拿到 event.target
  • 必须同时监听 unhandledrejection 事件来捕获没被 catch 的 Promise 错误:
window.addEventListener('unhandledrejection', event => {
  console.error('未处理的 Promise 拒绝:', event.reason);
  event.preventDefault(); // 阻止默认控制台报错(可选)
});

注意:unhandledrejection 在 Promise 被 reject 且没有 .catch 或 await 后无 try-catch 时才触发 —— 不是所有 reject 都算“未处理”。

为什么有些错误就是抓不到?

根本原因在于 JavaScript 错误分类和运行时机制。以下几类基本无法用常规 JS 错误处理捕获:

  • console.error() 不是错误,只是日志,不会触发任何异常机制
  • Web Worker 内部错误不会冒泡到主页面,需在 worker 内单独监听 onerror
  • iframe 中的脚本错误受同源策略限制,跨域 iframe 的错误信息不可读(只显示 Script error.
  • 某些浏览器扩展注入的脚本崩溃、或页面被强制 kill(如 iOS Safari 内存回收)—— 这些已脱离 JS 执行上下文

真正容易被忽略的点:错误对象的 stack 属性在压缩后可能指向混淆后的文件行号,上线前确保 source map 正确上传并被监控平台识别。否则你看到的 at a.js:1:1 没有任何调试价值。


# css  # javascript  # java  # js  # json  # 浏览器  # safari  # ai  # ios  # win  # 跨域  # 区别  # 为什么  # try  # throw  # catch  # Error  # 字符串  # Property  # Event  # map 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JS经典正则表达式笔试题汇总  如何在宝塔面板中创建新站点?  西安专业网站制作公司有哪些,陕西省建行官方网站?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  简单实现jsp分页  昵图网官方站入口 昵图网素材图库官网入口  什么是javascript作用域_全局和局部作用域有什么区别?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  原生JS获取元素集合的子元素宽度实例  免费视频制作网站,更新又快又好的免费电影网站?  Swift中循环语句中的转移语句 break 和 continue  如何在云指建站中生成FTP站点?  用yum安装MySQLdb模块的步骤方法  JavaScript如何实现路由_前端路由原理是什么  Python高阶函数应用_函数作为参数说明【指导】  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  php结合redis实现高并发下的抢购、秒杀功能的实例  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  浅述节点的创建及常见功能的实现  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  公司网站制作价格怎么算,公司办个官网需要多少钱?  香港服务器租用每月最低只需15元?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Laravel如何升级到最新版本?(升级指南和步骤)  郑州企业网站制作公司,郑州招聘网站有哪些?  如何破解联通资金短缺导致的基站建设难题?  html5如何实现懒加载图片_ intersectionobserver api用法【教程】  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  如何快速搭建高效香港服务器网站?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Laravel怎么在Blade中安全地输出原始HTML内容  怎么用AI帮你为初创公司进行市场定位分析?  想要更高端的建设网站,这些原则一定要坚持!  百度浏览器如何管理插件 百度浏览器插件管理方法  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  如何用花生壳三步快速搭建专属网站?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  香港服务器网站卡顿?如何解决网络延迟与负载问题?  清除minerd进程的简单方法  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  网易LOFTER官网链接 老福特网页版登录地址  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  Laravel如何处理文件下载请求?(Response示例)