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 in,避免非 Error 对象导致意外行为
stanceof 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检测网络重连并恢复硬件控制【操作】
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何登录建站主机?访问步骤全解析


stanceof Error