不能。try-catch 无法捕获异步错误(如 setTimeout、Promise.then 中抛出的错误)、语法错误、资源加载失败、跨域脚本错误及 Worker/iframe 内部错误;需结合 async/await、.catch()、全局 error/unhandledrejection 事件等机制补全。
不能。直接在 try 块里调用 setTimeout、fetch、Promise.then 等异步操作,其内部抛出的错误不会被外层 try-catch 捕获。
throw new Error()、访问 undefined.x)能被捕获async/await 函数内用 try-catch,或给 Promise 链添加 .catch()
unhandledrejection 事件,可全局监听但不等于“已处理”try-catch 对以下几类错误完全无效:
SyntaxError),比如少括号、错用 let 重复声明——这类错误发生在代码解析阶段,根本执行不到 try 块 或 import('./missing.mjs') 报的 TypeError(模块加载失败)Script error.),浏览器出于安全限制会抹除真实错误信息,仅留空消息靠组合机制覆盖更多场景,不是单靠 try-catch:
window.addEventListener('error', handler) 捕获未被捕获的同步运行时错误(含资源加载失败)window.addEventListener('unhandledrejection', e => { console.error(e.reason) })
import() 必须用 await import(...).catch(...),不能只靠外层 try
onerror 属性或 addEventListener('error') 捕获,但跨域脚本仍受限window.addEventListener('unhandledrejection', e => { e.preventDefault(); // 阻止默认控制台警告 console.error('Unhandled promise rejection:', e.reason); });
不是到处套 try-catch,而是聚焦可恢复、需记录、或影响流程的关键点:
JSON.parse(input) 必须包住,否则非法 JSON 直接崩掉逻辑await fetch(...) 后检查 response.ok,再 await response.json() 也得包住QuotaExceededError
try {
const data = JSON.parse(localStorage.getItem('config') || '');
renderConfig(data);
} catch (err) {
console.warn('Failed to load config, using defaults:', err.message);
renderConfig(defaultConfig);
}
全局错误和 Promise 拒绝监听容易漏配,尤其在微前端或动态加载模块的场景下;一旦没设 unhandledrejection,静默失败就很难定位。