为什么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
相关产品推荐
相关产品推荐

