javascript错误处理需分层覆盖:同步用try-catch,promise用.catch()或await+try-catch,全局用window.onerror和unhandledrejection监听兜底;须区分错误类型、抛出自定义错误并统一上报。

JavaScript 中没有“错误处理函数”能自动统一捕获所有异常,必须靠组合多种机制分层覆盖:同步错误靠 try-catch,异步 Promise 错误靠 .catch() 或 await + try-catch,全局漏网之鱼靠事件监听兜底。
同步代码:用 try-catch 精准包裹高风险操作
只对明确可能出错的同步逻辑使用,避免大段代码塞进 try 块:
-
常见场景:JSON.parse()、localStorage.getItem()、访问未定义对象属性、
new Date(无效字符串) - 不推荐:把整个函数体或事件回调整个包进去,会掩盖真实错误位置
-
建议写法:
function safeParse(jsonStr) { try { return JSON.parse(jsonStr); } catch (err) { console.error('JSON 解析失败:', err.message); return null; } }
Promise 异步错误:必须显式处理,不能依赖外层 try
Promise 拒绝(reject)不是抛异常,try { Promise.reject() } 完全无效:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
链式调用:在末尾加
.catch(),例如fetch().then().catch(handleError) -
async/await:每个
await表达式都需处在try块内,尤其是res.json()这类可能 SyntaxError 的操作 -
注意陷阱:不要混合写法,比如
async fn() { await p1(); } .catch()—— 这个.catch()只管fn()返回的 Promise,不管await p1()内部抛出的错误
全局兜底:监听未捕获错误和拒绝
这是最后一道防线,用于捕获所有漏掉的异常:
-
window.onerror:捕获同步脚本错误、资源加载失败(如图片 404)、跨域脚本错误(但堆栈信息常被抹为
Script error.) -
window.addEventListener('unhandledrejection'):捕获没加
.catch()的 Promise 拒绝,event.reason是拒绝值,可能是 Error 实例,也可能是字符串或普通值 - 绑定时机:必须在其他脚本执行前尽早注册,否则初始化阶段的错误会丢失
- 用途限制:仅适合日志上报或监控,不能用来恢复业务逻辑(无法阻止默认报错行为)
统一上报与分类:让错误真正“可处理”
光捕获不够,要让错误有业务意义:
-
区分错误类型:检查
error.name(如SyntaxError、TypeError、NetworkError),不同类别走不同策略(重试 / 降级 / 提示用户) -
主动抛出自定义错误:用
throw new MyApiError('请求超时', { code: 'TIMEOUT' }),便于上层按类识别 -
统一上报函数:封装
reportError({ message, stack, url, timestamp, context }),所有catch和全局监听都调它,避免日志散落
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










