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)等。异步代码(如 setTimeout、fetch、Promise 回调)里直接 throw,不会被外层 try-catch 捕获。
常见误判场景:
- 写了
try { fetch('/api').then(...)} catch(e) {...}—— 这个catch实际捕获不到 Promise 内部错误 -
JSON.parse('invalid')会触发,但JSON.parse(undefined)也会(因为传了非字符串) - 箭头函数中忘记写
return,导致意外返回undefined,后续调用.map报TypeError: 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 就以为万事大吉 —— 它只拒绝网络级错误(如离线),404、500仍返回成功 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示例)


