javascript错误处理怎么做_try catch如何捕获异常

发布时间 - 2026-01-09 00:00:00    点击率:
try catch 仅捕获同步异常,如 throw、ReferenceError、TypeError、SyntaxError;对异步错误、事件处理器错误、Promise 错误无效;需用 .catch() 或 async/await 配合;应记录 e.name 和 e.stack;finally 中抛错会覆盖原错误。

try catch 能捕获哪些错误

它只捕获**同步执行过程中抛出的异常**,比如 throw new Error()、引用未定义变量(ReferenceError)、调用非函数值(TypeError)、JSON 解析失败(SyntaxError)等。但对以下情况完全无效:

  • 异步代码里的错误(如 setTimeoutPromise 回调、fetch 失败)
  • 事件处理器中抛出的错误(如 onclickthrow
  • 语法错误(SyntaxError)——这类错在解析阶段就报了,根本进不了 try

Promise 中的错误不能靠外层 try catch 捕获

写成这样是徒劳的:

try {
  fetch('/api/data').then(res => res.json()).then(data => console.log(data));
} catch (e) {
  console.error('这根本不会执行');
}

因为 fetch 立即返回一个 Promisetry 块结束时它还没 resolve 或 reject。正确做法是:

  • .catch() 链式处理:fetch(...).then(...).catch(e => {...})
  • 或用 async/await 配合 try/catch(注意函数必须是 async
async function loadData() {
  try {
    const res = await fetch('/api/data');
    const data = await res.json();
    console.log(data);
  } catch (e) {
    console.error('网络或解析出错了', e);
  }
}

不要忽略 error 对象的细节

很多人只写 catch (e) { console.error(e) },但 e 是个对象,关键信息藏在属性里:

  • e.message:人类可读的错误描述(如 "Cannot read property 'x' of undefined"
  • e.name:错误类型名("TypeError""SyntaxError"),可用于条件判断
  • e.stack:调用栈,定位问题位置最直接的依据
  • 某些环境(如 Chrome)还提供 e.cause(链式错误原因)

生产环境建议至少记录 e.namee.stack,光打 e.toString() 会丢掉上下文。

finally 不是万能收尾,别在这里 throw

finally 块总会执行,适合清理资源(如关闭加载状态、清除定时器),但它有两条铁律:

  • 如果 finallythrow 或返回一个 rejected Promise,它会覆盖前面 trycatch 中的返回值或错误
  • 不要在 finally 里做可能失败的操作(比如又发一次 fetch),否则可能把原错误“吞掉”

常见误用:

try {
  riskyOperation();
} catch (e) {
  console.error(e);
  throw e; // 原意是重抛
} finally {
  await cleanup(); // 如果 cleanup() 抛错,上面的 throw 就被覆盖了
}

真正安全的清理,应该确保自身不抛错,或单独捕获其内部异常。


# javascript  # java  # js  # json  # 处理器  #   # ai 


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


相关推荐: Laravel如何处理文件下载请求?(Response示例)  详解jQuery中的事件  googleplay官方入口在哪里_Google Play官方商店快速入口指南  JavaScript常见的五种数组去重的方式  如何打造高效商业网站?建站目的决定转化率  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  ,在苏州找工作,上哪个网站比较好?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  JavaScript如何实现倒计时_时间函数如何精确控制  Linux网络带宽限制_tc配置实践解析【教程】  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  大同网页,大同瑞慈医院官网?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  详解阿里云nginx服务器多站点的配置  奇安信“盘古石”团队突破 iOS 26.1 提权  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  在Oracle关闭情况下如何修改spfile的参数  Laravel如何实现事件和监听器?(Event & Listener实战)  详解MySQL数据库的安装与密码配置  浅析上传头像示例及其注意事项  bing浏览器学术搜索入口_bing学术文献检索地址  浅谈javascript alert和confirm的美化  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  BootStrap整体框架之基础布局组件  中国移动官方网站首页入口 中国移动官网网页登录  如何快速搭建虚拟主机网站?新手必看指南  Bootstrap整体框架之CSS12栅格系统  魔毅自助建站系统:模板定制与SEO优化一键生成指南  如何用PHP快速搭建CMS系统?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  如何用VPS主机快速搭建个人网站?  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Laravel如何实现文件上传和存储?(本地与S3配置)  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Laravel如何与Pusher实现实时通信?(WebSocket示例)