如何防止JavaScript错误中断代码运行 实现报错不阻断程序执行
全局捕获错误且不中断代码运行实现方案
默认场景下未被手动捕获的同步错误、未被catch的Promise拒绝都会终止后续代码执行,我们可以通过全局事件监听、高阶函数封装两种方式,实现错误自动打印console.error且不中断执行的效果,具体实现分场景如下:
浏览器环境全局捕获
同步错误捕获
window.addEventListener('error', (event) => { console.error('未处理同步错误:', event.error, '触发位置:', event.filename, event.lineno) // 阻止浏览器默认的错误抛出行为,后续代码可正常执行 return true })
异步Promise错误捕获
window.addEventListener('unhandledrejection', (event) => { console.error('未处理Promise拒绝:', event.reason) // 阻止浏览器默认抛错逻辑 event.preventDefault() })
Node.js环境全局捕获
同步错误捕获
process.on('uncaughtException', (err) => { console.error('未处理同步异常:', err) // 监听该事件后默认不会终止进程,后续代码可继续执行 // 注意:异常发生后进程内存状态可能存在不可预期的问题,生产环境建议打印日志后做优雅重启 })
异步Promise错误捕获
process.on('unhandledRejection', (reason, promise) => { console.error('未处理Promise拒绝:', reason, '关联Promise实例:', promise) })
局部代码块容错方案
如果不需要全局生效,只想对指定代码块做容错处理,可以封装高阶工具函数:
const runWithErrorTolerance = (execFn) => { try { const result = execFn() // 兼容异步函数返回Promise的场景 if (result instanceof Promise) { return result.catch(err => { console.error('异步执行错误:', err) }) } return result } catch (err) { console.error('同步执行错误:', err) } } // 使用示例 runWithErrorTolerance(() => { throw new Error('测试抛错') }) console.log('后续代码正常执行') // 该行会正常输出
注意事项
- 全局捕获仅建议用于通用日志上报、边缘异常容错场景,不要替代业务代码内部的针对性错误处理,避免隐藏本应暴露的业务逻辑问题
- Node.js生产环境触发
uncaughtException后,不建议长时间保留异常进程继续运行,避免出现内存泄漏、逻辑异常等次生问题
内容的提问来源于stack exchange,提问作者RandomWeeb315
相关产品推荐
相关产品推荐

