try-catch仅捕获同步错误,异步错误需在回调内单独处理;catch可接收任意值但推荐Error实例以保留堆栈;finally中return会覆盖try/catch的返回值;顶层不应盲目包裹,应聚焦明确边界和错误响应。
异步代码(比如 setTimeout、fetch、Promise 回调)抛出的错误,不会被外层 try-catch 捕获。这是最常踩的坑——你以为包住了,

try-catch,或用 .catch() 处理 Promise 拒绝try {
setTimeout(() => {
throw new Error('这个错误抓不到');
}, 0);
} catch (e) {
console.log('永远不会执行到这里');
}async/await + try-catch,比链式 .then().catch() 更直观不是。JavaScript 允许 throw 任意值(字符串、数字、对象),catch 参数就是那个值本身。但不推荐抛出非 Error 实例,因为会丢失堆栈信息,调试困难。
throw '请求失败'; // 没有 stack,难定位
throw new Error('请求失败'); // 自动带 stackstack 或用 console.trace() 辅助排查可以,但只对 return 语句有效,且行为取决于 finally 是否自己 return。
finally 不 return,则原函数的 return 值生效finally 有 return,它会覆盖前面所有 return(包括 catch 中的)function test() {
try {
return 'from try';
} catch (e) {
return 'from catch';
} finally {
return 'from finally'; // ✅ 最终返回这个
}
}finally 应只做清理(如关闭连接、重置状态),避免干扰控制流不要盲目加。全局 try-catch(比如包住整个脚本)掩盖问题,让错误静默失败,反而更难调试。
try {
// 几百行业务逻辑全包在这里
} catch (e) {
console.error(e); // 错误来源模糊,堆栈被截断
}window.onerror 或 window.addEventListener('error') 捕获未处理异常,配合 PromiseRejectionEvent 补全异步错误
来电咨询