大厂面试重在考察对javascript执行模型与错误边界的理解:同步异常线性中断、promise构造函数内throw不被catch、async/await中未await的promise无法被外层try/catch捕获。

大厂面试中,流程控制与异步异常捕获常被用来考察候选人对 JavaScript 执行模型、错误边界和真实工程问题的处理能力。光会写 try/catch 或 .catch() 不够,关键在于理解“控制流何时中断”“错误是否可被捕获”“不同异步场景下谁负责兜底”。下面分三类典型追问拆解核心要点和应答逻辑。
同步流程中的异常传播与提前终止
面试官可能让你手写一个带校验、转换、合并的链式函数,并问:“如果中间某步抛错,后续逻辑还执行吗?怎么确保资源清理?”
- JavaScript 同步代码是立即执行、线性中断的:一旦 throw,当前函数剩余语句不执行,错误沿调用栈向上冒泡,直到被捕获或导致进程终止(浏览器中为 uncaught error)
-
finally是唯一能保证执行的块,适合关文件、清定时器、释放锁等——它不关心 try 是否成功、catch 是否触发 - 避免在 finally 中 throw 新错误(会覆盖原始错误),如需记录,用
console.error(e)而非throw e
Promise 链中的错误捕获盲区
常见陷阱题:“new Promise(() => { throw 'err' }).catch(console.log) 能打印 err 吗?” 答案是不能——因为构造函数里的 throw 不进入 Promise 状态,而是直接抛到全局。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Promise 构造函数中 必须用
reject()主动拒绝,或让 executor 内部同步错误被自动捕获(但仅限于 executor 函数体,不包括其内部异步回调) - Promise 链中,
.catch()只捕获前一个 Promise 的 reject 和其 handler 中的同步错误;若.then(onFulfilled)里 throw,会被下一个.catch()捕获,但若链末尾没 catch,就变成 unhandled rejection - 推荐写法:每个 Promise 链结尾加
.catch(handleError),或全局监听window.addEventListener('unhandledrejection', ...)做兜底日志
async/await 下的 try/catch 本质与边界
面试官可能对比写法:async () => { await p1(); await p2(); } vs async () => { await p1(); p2(); },问“第二个 p2 抛错能被外层 try/catch 捕获吗?”
-
await只暂停当前 async 函数执行,但p2()若返回 Promise 且未 await,它就变成“飞离的 Promise”,其 reject 不影响当前函数流程,也不会被当前 try/catch 捕获 - 真正安全的写法是:所有可能 reject 的 Promise 都要 await 或显式 .catch();若想并发执行多个请求并统一处理错误,用
Promise.allSettled()而非Promise.all() - 注意:async 函数本身返回 Promise,所以外层调用仍需处理它的 reject,不能只依赖内部 try/catch
本质上,大厂关注的不是语法细节,而是你能否判断“错误发生在哪一层上下文”“控制权是否还在自己手里”“谁该为这次失败负责”。把执行栈、微任务队列、Promise 状态机串起来讲清楚,比背 API 更有说服力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










