try...catch 仅捕获同步运行时错误,如 JSON.parse 异常、TypeError 和主动 throw;对异步错误、语法错误、已处理 Promise 拒绝及全局未捕获错误无效,需配合 .catch()、unhandledrejection 和 error 事件。

JavaScript 的 try...catch 能捕获同步代码中的运行时错误,但对异步错误、语法错误、Promise 拒绝和全局未捕获错误无效——得配合其他机制一起用。
什么时候 try catch 有用?
它只拦截当前执行栈中抛出的同步异常,比如:
-
JSON.parse("invalid")抛出SyntaxError -
undefined.foo()抛出TypeError -
throw new Error("boom")主动抛出的错误
下面这段能被捕获:
try {
JSON.parse("{");
} catch (err) {
console.log(err instanceof SyntaxError); // true
}
为什么 await Promise.reject() 有时 catch 不到?
因为 await 后面如果不是 Promise,或 Promise 已经 settled(fulfilled/rejected),try...catch 就不会触发。常见陷阱:
立即学习“Java免费学习笔记(深入)”;
- 没
await:直接写fetch("/api").catch(...),try...catch不起作用 - Promise 已被 .catch() 处理过:后续再 await 它,不会再次抛错
- 多个 await 连续调用时,只在第一个出错位置中断,后面语句不执行
正确写法:
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
try {
const res = await fetch("/api");
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json(); // 这里可能抛 SyntaxError
} catch (err) {
console.error("请求或解析失败:", err.message);
}
Promise 中的错误怎么捕获?
try...catch 对 .then().catch() 链里的错误无效。必须用:
-
.catch()显式处理每个 Promise 链末端 - 顶层加
window.addEventListener("unhandledrejection")捕获漏网之鱼 - 避免在
.then()回调里抛错却不接.catch()
例如:
fetch("/api")
.then(res => {
if (!res.ok) throw new Error("Network error");
return res.json();
})
.then(data => console.log(data))
.catch(err => console.error("Promise 链中任一环节出错:", err));
容易忽略的边界情况
很多开发者以为加了 try...catch 就万事大吉,其实这些地方它完全不生效:
- 语法错误(如少括号、错拼
function):发生在解析阶段,无法被运行时捕获 -
setTimeout(() => { throw new Error() }):错误在新执行上下文中,脱离原try范围 - 事件回调里的错误(如
button.addEventListener("click", () => null.foo())) - 未被
await的 Promise 拒绝(会触发unhandledrejection事件,但不中断流程)
真正健壮的错误处理,得把 try...catch、.catch()、unhandledrejection 和 error 全局监听组合起来,缺一不可。









