try-catch仅捕获同步运行时异常,对语法错误、异步错误、Promise拒绝等无效;需在async函数中用await配合try-catch,或用.catch()处理Promise,语法错误须依赖编辑器/构建工具检测。

JavaScript 中的错误处理核心就是 try-catch,但它不是万能的“兜底开关”——它只捕获同步代码中抛出的异常,对异步错误、语法错误、Promise 拒绝(reject)或未捕获的 Promise 错误默认不生效。
什么时候 try-catch 有效?
它只在运行时同步执行路径中起作用。比如调用一个会抛出 throw new Error() 的函数,或访问 undefined 的属性(TypeError),或 JSON.parse() 解析失败(SyntaxError)。
常见误区是以为它能捕获 setTimeout 或 fetch 里的错误——其实不能,除非你在回调或 async 函数内部自己写 try-catch。
-
try块里必须是可立即执行的同步语句 -
catch参数(如err)是Error实例,有message、name、stack等属性 -
finally总会执行,适合清理资源(如关闭模拟连接、重置状态),但不要在里面return或抛错,否则会覆盖前面的返回值或异常
try {
JSON.parse('{ "valid": true'); // 缺少 }
} catch (err) {
console.log(err.name); // SyntaxError
console.log(err.message); // "Unexpected end of JSON input"
}
try-catch 对 Promise 错误无效?
直接包住 fetch() 或 new Promise() 不会捕获其内部拒绝(reject)。因为 Promise 构造器本身同步执行,但 reject 是异步调度的,脱离了 try 块的执行栈。
立即学习“Java免费学习笔记(深入)”;
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
正确做法是:在 async 函数中用 await,再套 try-catch;或用 .catch() 显式处理 Promise 链。
- 用
await+try-catch更直观,但只在async函数内可用 -
.catch()更通用,适用于任何 Promise,包括非async上下文 - 忘记处理 Promise 拒绝会导致
Uncaught (in promise) ...控制台警告,甚至被全局unhandledrejection事件捕获
async function loadData() {
try {
const res = await fetch('/api/data');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (err) {
console.error('加载失败:', err.message);
return null;
}
}
哪些错误 try-catch 根本捕不到?
语法错误(SyntaxError)在代码解析阶段就报错,根本不会进入执行,所以 try-catch 完全无效。同理,模块加载失败(如 import 路径错误)、顶层 await 报错、或 eval 外部的语法问题,都不归它管。
另外,异步任务中的未处理拒绝(Promise.reject() 没接 .catch)、资源加载失败(如 的 onerror)、或 postMessage 通信错误,也都需要各自对应的机制处理。
- 语法错误 → 查编辑器/构建工具报错,不是运行时问题
- 未处理 Promise 拒绝 → 监听
window.addEventListener('unhandledrejection', ...) - 资源加载失败 → 绑定
img.onerror、script.onerror等原生事件
真正难的不是写 try-catch,而是判断该在哪一层加、加了是否真起作用、以及有没有漏掉异步分支或边界条件。很多线上静默失败,都是因为把 try-catch 当成了“全局异常保险丝”,而没意识到它的作用域非常具体。










