javascript错误处理怎么做_如何使用try-catch捕获异常?

发布时间 - 2026-01-04 00:00:00    点击率:
try-catch仅捕获同步运行时错误(如ReferenceError、TypeError),无法捕获异步错误;Promise错误需用.catch()或await+try-catch处理;catch应分类处理、记录上下文、友好提示;finally用于清理但不改变错误流向。

try-catch 能捕获哪些错误?

它只捕获**运行时同步错误**,比如 ReferenceErrorTypeErrorSyntaxError(仅限 eval 内)、RangeError 等。异步操作(如 setTimeoutfetch、Promise 回调)里的错误默认逃逸出 try 块,不会被捕获。

常见误判场景:

  • 写了 try { fetch('/api').then(...); }fetch 本身不抛错,但 .thenthrow 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 —— 后续逻辑可能因 dataundefined 再次崩

catch 块里该做什么?

核心原则:**明确错误来源,做最小必要响应,别掩盖问题**。

实用建议:

  • 区分错误类型再处理:if (err instanceof TypeError) vs if (err.name === 'AbortError')
  • 记录关键上下文:比如当前 URL、用户操作步骤、输入参数(避免只打 err.message
  • 给用户可理解的提示,而不是堆栈:alert('保存失败,请检查网络后重试'),而非 alert(err.stack)
  • 必要时主动 throw errreturn Promise.reject(err),让上层决定是否兜底

finally 有什么实际用途?

它不管成功失败都会执行,适合清理工作,但**不能访问 err 或返回值**。

典型用例:

  • 关闭加载态:loading.value = false
  • 释放资源:controller.abort()(配合 fetchsignal
  • 还原 UI 状态:比如解锁按钮、恢复表单 disabled 状态

注意:finally 中抛出新错误会覆盖原错误;若需透传原错误,别在 finallythrow

真正容易被忽略的是:很多人以为 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手机网站吸引移动用户?