You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:24:04