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

为什么try-catch无法捕获Promise链.then().catch()中抛出的错误

异常未被捕获的核心原因

外层try-catch只能捕获两类异常:同步代码抛出的错误、await关键字后Promise变为rejected状态抛出的错误。你当前写法下,this.authService.generateAccessToken返回的Promise没有被await,它的.catch回调是异步执行的,此时外层的try块已经执行结束,回调里抛出的错误会成为未处理的Promise rejection,无法被外层try-catch捕获。

具体问题拆解
  • 你调用generateAccessToken时没有加await,代码不会等待这个异步方法执行完成,会直接跳过这段Promise链继续运行
  • .then和.catch的回调都属于异步微任务,只有同步代码全部执行完成后才会进入事件循环调度执行,等到.catch里的throw err执行时,外层的try块已经执行完毕,上下文已经销毁,自然无法捕获这个异步抛出的错误
修复方案

推荐直接改用await写法替代Promise链式调用,代码更简洁也更易排查问题:

async logIn(
        req: Request,
        res: Response,
        next: NextFunction
    ): Promise<Response<any, Record<string, any>>> {
        try {
            const { userName, password } = req.body;
            const user = await this.userService.getUserByPassword(
                userName,
                password
            );

            if (user) {
                const userData: UserData = {
                    id: user.id,
                    email: user.email,
                    firstName: user.firstName,
                    lastName: user.lastName,
                    userName: user.userName
                };
                // 改为await写法,异常会直接被外层try-catch捕获
                const accessToken = await this.authService.generateAccessToken(userData, ROLE.admin);
                return res.cookie('token', accessToken).json(userData);
            }
        } catch (err) {
            const error = errorHandler(err);
            return res.status(400).send(error);
        }
    }

如果你一定要保留.then.catch的写法,可以在.catch里直接执行错误处理逻辑,不需要抛出错误:

this.authService
    .generateAccessToken(userData, ROLE.admin)
    .then((accessToken) => {
        return res.cookie('token', accessToken).json(userData);
    })
    .catch((err) => {
        const error = errorHandler(err);
        return res.status(400).send(error);
    });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:51:03