You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何async函数调用时无法通过try/catch捕获异常?

为什么async函数调用处的try/catch无法捕获异常?

我写了两段代码,普通函数在调用处用try/catch能正常捕获异常,但给函数加上async关键字后,调用处的try/catch就抓不到异常了。我知道可以在async函数内部捕获异常,现在只想搞清楚为什么调用处的try/catch无法捕获。

代码示例

async函数情况

//async函数
async function lome() {
throw new Error("error");
}

try { lome() } catch { console.log("hey") };

//output: error

普通函数情况

//普通函数
function lome() {
throw new Error("error");
}

try { lome() } catch { console.log("hey") };

//output:hey 

补充测试代码

非async环境使用await报错

async function lome() {
throw new Error("error");
}

try { await lome() } catch { console.log("hey") };

//output: Uncaught SyntaxError: await is only valid in async 
//functions and the top level bodies of modules.

async函数内部返回reject的Promise

async function lome() {
return await Promise.reject(99)
}

try { lome() } catch { console.log("hey") }

//output: error(我测试过带和不带return关键字的情况)

原因解析

核心差异:同步异常 vs Promise异步错误

  • 普通函数抛出的是同步异常:函数执行时立即抛出错误,属于当前同步执行流程的一部分,调用处的try/catch能直接捕获。
  • async函数的本质是自动包装返回值为Promise:哪怕你在函数里直接throw错误,这个错误会被JavaScript引擎自动捕获,并转换成返回Promise的reject状态。这个reject的错误属于异步任务,同步的try/catch只能捕获当前同步栈里的异常,无法触及异步的Promise错误。

关于测试场景的补充

  1. 非async环境用await报错是语法限制:await必须在async函数或模块顶层作用域使用,这是语言语法规则,和异常捕获逻辑无关。
  2. async函数内部用await Promise.reject:无论是否加return,async函数最终都会把这个reject的Promise作为自己的返回值。调用它时拿到的依然是一个处于reject状态的Promise,同步try/catch还是无法捕获,因为这依然是异步范畴的错误。

内容的提问来源于stack exchange,提问作者lome1446

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:45:59