JavaScript如何进行错误处理_try-catch和Promise.catch怎么用

发布时间 - 2025-12-25 00:00:00    点击率:
JavaScript错误处理需区分同步与异步:同步错误用try-catch捕获,异步Promise错误用.catch()或await+try-catch;两者不可互换,全局兜底用window.onerror和unhandledrejection。

JavaScript 错误处理主要靠 try-catch 处理同步错误,用 .catch() 处理 Promise 异步错误;两者不能互相替代,得按执行时机选对方式。

同步错误:用 try-catch 捕获

try-catch 只能捕获运行时同步抛出的错误(比如 throw new Error()、引用未定义变量、JSON.parse 失败等),无法捕获异步代码里的错误(如 setTimeout 里的 throw)。

基本写法:

try {
  const data = JSON.parse('{ "name": "Alice"'); // 缺少 }
  console.log(data);
} catch (err) {
  console.error('解析失败:', err.message); // SyntaxError: Unexpected end of JSON input
}
  • 推荐始终在 catch 中检查 err instanceof Error,避免非 Error 对象导致意外行为
  • 可以加 finally 块做清理工作(无论成功失败都执行)
  • 不要空 catch(即 catch {}),至少记录日志或重新抛出

异步错误(Promise):用 .catch() 或 await + try-catch

Promise 链中的错误不会冒泡到外层 try-catch,必须显式用 .catch() 或配合 await 使用 try-catch

写法一(链式调用):

fetch('/api/user')
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error('请求或解析失败:', err));

写法二(async/await 更直观):

async function getUser() {
  try {
    const res = await fetch('/api/user');
    const data = await res.json();
    console.log(data);
  } catch (err) {
    console.error('哪里出错了:', err);
  }
}
  • 多个 await 可共用一个 try-catch,逻辑更集中
  • .catch() 必须放在 Promise 链末尾,否则中间错误会丢失
  • 如果 Promise 被 reject 但没接 .catch(),控制台会报 “Uncaught (in promise)” 警告

全局兜底:window.onerror 和 unhandledrejection

用于捕获漏掉的错误,适合监控和上报,不适合业务逻辑恢复。

  • window.onerror:捕获同步脚本错误、资源加载失败(如 JS 文件 404)
  • window.addEventListener('unhandledrejection'):捕获未被 .catch()try-catch 拦截的 Promise reject

示例:

window.addEventListener('unhandledrejection', event => {
  console.warn('未处理的 Promise 错误:', event.reason);
  // 可上报到 Sentry 或其他监控平台
});

常见误区提醒

  • try-catch 包不住 setTimeout(() => { throw new Error(); }) —— 这是异步错误,要用 unhandledrejection 或包装成 Promise
  • Promise.reject() 不等于抛错,它只是创建一个已拒绝的 Promise,需用 .catch() 接住
  • 不要在 catch 里吞掉错误又不处理也不上报,这会让问题难以排查
  • Node.js 环境下还有 process.on('uncaughtException')process.on('unhandledRejection'),原理类似但监听对象不同


# javascript  # java  # js  # node.js  # json  # node  # ai  # win 


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


相关推荐: 微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  ,南京靠谱的征婚网站?  JavaScript常见的五种数组去重的方式  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel PHP版本要求一览_Laravel各版本环境要求对照  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Angular 表单中正确绑定输入值以确保提交与验证正常工作  油猴 教程,油猴搜脚本为什么会网页无法显示?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Laravel如何使用Telescope进行调试?(安装和使用教程)  Linux网络带宽限制_tc配置实践解析【教程】  如何快速重置建站主机并恢复默认配置?  JS去除重复并统计数量的实现方法  Laravel如何处理异常和错误?(Handler示例)  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  EditPlus中的正则表达式 实战(2)  Windows Hello人脸识别突然无法使用  Laravel如何与Pusher实现实时通信?(WebSocket示例)  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  如何用景安虚拟主机手机版绑定域名建站?  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  晋江文学城电脑版官网 晋江文学城网页版直接进入  详解阿里云nginx服务器多站点的配置  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  如何快速使用云服务器搭建个人网站?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  Laravel怎么在Controller之外的地方验证数据  三星、SK海力士获美批准:可向中国出口芯片制造设备  怎么用AI帮你设计一套个性化的手机App图标?  黑客入侵网站服务器的常见手法有哪些?  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  实现点击下箭头变上箭头来回切换的两种方法【推荐】  网站页面设计需要考虑到这些问题  5种Android数据存储方式汇总  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Laravel如何创建自定义中间件?(Middleware代码示例)  Laravel如何使用Blade模板引擎?(完整语法和示例)  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  创业网站制作流程,创业网站可靠吗?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  北京的网站制作公司有哪些,哪个视频网站最好?  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Firefox Developer Edition开发者版本入口  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何登录建站主机?访问步骤全解析