javascript错误处理怎么做_如何使用try-catch捕获异常?
发布时间 - 2026-01-04 00:00:00 点击率:次try-catch仅捕获同步运行时错误(如ReferenceError、TypeError),无法捕获异步错误;Promise错误需用.catch()或await+try-catch处理;catch应分类处理、记录上下文、友好提示;finally用于清理但不改变错误流向。
try-catch 能捕获哪些错误?
它只捕获**运行时同步错误**,比如 ReferenceError、TypeError、SyntaxError(仅限 eval 内)、RangeError 等。异步操作(如 setTimeout、fetch、Promise 回调)里的错误默认逃逸出 try 块,不会被捕获。
常见误判场景:
- 写了
try { fetch('/api').then(...); }→fetch本身不抛错,但.then里throw new Error()不会被捕获 -
try { JSON.parse('{"a":}') }→ 会触发SyntaxError,能捕获 -
try { undefined.foo() }→ 触发TypeError,能捕获
如何正确捕获 Promise 异步错误?
不能靠外层 try-catch 包住 .then(),得用 .catch() 或 await + try-catch。
推荐写法(现代 JS):
立即学习“Java免费学习笔记(深入)”;
async function loadData() {
try {
const res = await fetch('/api');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
return data;
} catch (err) {
console.error('请求或解析失败:', err.message);
// 这里能拿到 fetch 网络错误、JSON 解析错误、手动 throw 的错误
}
}
注意点:
-
await后必须是 Promise,否则不会挂起,也不会把 rejection 转为异常 -
fetch只在网络断开等极少数情况 reject;HTTP 4xx/5xx 仍返回 resolve 的 Response 对象,需手动检查res.ok - 不要在
catch里吞掉错误又不 re-throw —— 后续逻辑可能因data是undefined再次崩
catch 块里该做什么?
核心原则:**明确错误来源,做最小必要响应,别掩盖问题**。
实用建议:
- 区分错误类型再处理:
if (err instanceof TypeError)vsif (err.nam
e === 'AbortError') - 记录关键上下文:比如当前 URL、用户操作步骤、输入参数(避免只打
err.message) - 给用户可理解的提示,而不是堆栈:
alert('保存失败,请检查网络后重试'),而非alert(err.stack) - 必要时主动
throw err或return Promise.reject(err),让上层决定是否兜底
finally 有什么实际用途?
它不管成功失败都会执行,适合清理工作,但**不能访问 err 或返回值**。
典型用例:
- 关闭加载态:
loading.value = false - 释放资源:
controller.abort()(配合fetch的signal) - 还原 UI 状态:比如解锁按钮、恢复表单 disabled 状态
注意:finally 中抛出新错误会覆盖原错误;若需透传原错误,别在 finally 里 throw。
真正容易被忽略的是:很多人以为 finally 能“兜住”所有异常 —— 它只是保证执行,不改变错误流向。
# javascript
# java
# js
# json
# 栈
# ai
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
网站制作软件有哪些,制图软件有哪些?
Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】
lovemo网页版地址 lovemo官网手机登录
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
利用JavaScript实现拖拽改变元素大小
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
JavaScript模板引擎Template.js使用详解
如何用狗爹虚拟主机快速搭建网站?
制作电商网页,电商供应链怎么做?
如何在建站之星网店版论坛获取技术支持?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
如何用PHP快速搭建高效网站?分步指南
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
公司网站制作需要多少钱,找人做公司网站需要多少钱?
如何在橙子建站中快速调整背景颜色?
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
如何在宝塔面板中修改默认建站目录?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
Android利用动画实现背景逐渐变暗
如何在香港服务器上快速搭建免备案网站?
Laravel如何使用Service Container和依赖注入?(代码示例)
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像
如何在七牛云存储上搭建网站并设置自定义域名?
如何在建站主机中优化服务器配置?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
详解阿里云nginx服务器多站点的配置
如何基于PHP生成高效IDC网络公司建站源码?
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
做企业网站制作流程,企业网站制作基本流程有哪些?
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
javascript读取文本节点方法小结
个人网站制作流程图片大全,个人网站如何注销?
如何用好域名打造高点击率的自主建站?
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
JavaScript如何实现音频处理_Web Audio API如何工作?
Laravel PHP版本要求一览_Laravel各版本环境要求对照
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
如何用搬瓦工VPS快速搭建个人网站?
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
如何快速搭建高效WAP手机网站吸引移动用户?


e === 'AbortError')