JavaScript错误处理核心是try...catch...finally捕获运行时异常,throw主动抛错;不处理语法错误;需注意异步错误需内部捕获,全局错误用window.onerror或unhandledrejection监听。
JavaScript 中通过 try...catch...finally 语句捕获运行时异常,配合 throw 主动抛出错误,构成其核心错误处理机制。它不处理语法错误(编译阶段报错),只捕获执行阶段的异常。
把可能出错的代码放在 try 块中,错误发生时会立即跳转到 catch 块;catch 接收一个参数(通常是 error),包含错误类型、消息和堆栈信息。
catch 后可接 finally,无论是否出错都会执行,适合清理资源(如关闭加载状态、释放定时器)console.error(error) 或上报监控系统用 throw 抛出任意值,但推荐使用 new Error('msg') 或其子类(如 TypeError、SyntaxError),便于统一识别和处理。
if (!url) throw new TypeError('URL is required')
Error 创建业务错误类,比如 class ApiError extends Error,添加 statusCode 等字段throw 后的代码不会执行,类似 return
用于捕获未被 try...catch 拦截的错误,比如脚本加载失败、静态资源 404、跨域 script 错误(部分限制)。
window.onerror = (msg, url, line, col, error) => { ... } 是传统方式,兼容性好window.addEventListener('error', e => { ... }) 更现代,能捕获更多错误类型(如 Promise 拒绝未处理时需配合 unhandledrejection)unhandledrejection 监听未捕获的 Promise 错误:window.addEventListener('unhandledrejection', e => console.warn
(e.reason))
定时器、事件回调、Promise.then 回调里的错误,会脱离原始 try 块作用域。必须在异步内部处理,或用 Promise 链式 catch / async/await + try/catch。
fetch('/api').then(...).catch(handleError)
try { const res = await fetch(...); } catch (e) { handleError(e) }
基本上就这些。关键不是“有没有 try”,而是“错误是否在预期位置被捕获并有意义地响应”。不复杂但容易忽略异步和全局场景。