同步错误用try/catch捕获,异步错误需promise.catch()或await+try/catch,回调错误须显式判断err参数,全局用unhandledrejection/error兜底。

同步与异步错误不能混用同一套 try/catch 处理,因为异步操作(如 Promise、setTimeout、fetch)抛出的错误不会被外层同步 try 捕获。关键在于区分错误来源,并为每种场景提供对应的捕获机制。
同步错误:用 try/catch 直接包裹
函数内部立即执行、不涉及回调或 Promise 的逻辑,错误可被标准 try/catch 捕获。
- 适用于:参数校验失败、JSON.parse 异常、同步方法调用(如 Array.prototype.map 抛出异常)
- 注意:不要在
catch中静默吞掉错误,至少记录或转换为统一格式 - 示例:若
parseConfig(str)是纯同步解析,直接try { parseConfig(input) } catch (e) { handleError(e) }
Promise 异步错误:用 .catch() 或 await + try/catch
Promise 链中的 reject 或 throw 不会触发外层同步 try,必须在 Promise 层级处理。
- 推荐用
async/await配合try/catch,语义清晰且能复用同步错误处理逻辑 - 避免忘记
await:未 await 的 Promise 抛错将变成未捕获拒绝(unhandled rejection) - 示例:
try { const data = await fetch('/api').then(r => r.json()); } catch (e) { handleError(e); }
回调风格异步错误:显式检查 error 参数
Node.js 风格回调(callback(err, result))中,错误通过第一个参数传递,不是抛出的。
- 必须主动判断
if (err) { ... },不能依赖try/catch - 可封装一层 Promise 化工具(如
util.promisify),转为 async/await 形式统一处理 - 示例:
fs.readFile('file.txt', (err, data) => { if (err) return handleError(err); process(data); });
全局兜底:监听 unhandledrejection 和 error
用于捕获漏网之鱼,不能替代局部错误处理,而是最后一道防线。
-
window.addEventListener('unhandledrejection', e => {...}):捕获未.catch()的 Promise 拒绝 -
window.addEventListener('error', e => {...}):捕获全局同步错误(如脚本加载失败、语法错误) - 仅用于日志上报或友好降级,不要在此重试或修改业务状态











