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

如何捕获Angular中http.get()请求抛出的错误?

Angular HTTP请求错误捕获方案

你用try/catch无法捕获this.http.get()的错误,是因为HTTP请求返回的是RxJS Observable异步流,流内的错误不会被同步的try/catch捕获,必须用RxJS的catchError操作符来处理。

步骤1:导入必要的RxJS操作符

首先在认证服务文件顶部导入所需操作符:

import { catchError, map } from 'rxjs/operators';
import { throwError } from 'rxjs';

步骤2:修改代码添加错误处理

在pipe()中加入catchError操作符,放在map之后,用于捕获请求错误并处理:

return this.http
  .get<any>(`${environment().apiUrl}/auth/refresh`, {
    headers: { Authorization: `Bearer ${this.userValue?.refreshToken}` },
  })
  .pipe(
    map((data) => {
      // 移除原代码中的async,map不需要异步(如果parseAndReturnUser是同步方法)
      let user = this.parseAndReturnUser(data);
      user.refreshToken = this.userValue?.refreshToken;
      this.userSubject.next(user);
      this.startRefreshTokenTimer();
      return data;
    }),
    catchError((error) => {
      // 编写你的错误处理逻辑
      console.error('刷新令牌请求失败:', error);

      // 示例:如果是401未授权,清除用户状态
      if (error.status === 401) {
        this.userSubject.next(null);
        this.stopRefreshTokenTimer(); // 假设你有对应的停止定时器方法
      }

      // 重新抛出错误,让订阅该Observable的地方也能捕获处理
      return throwError(() => error);
    })
  );

关键注意事项

  • 如果parseAndReturnUser是异步方法(返回Promise),不要用map(async...),换成switchMap:
switchMap(async (data) => {
  let user = await this.parseAndReturnUser(data);
  user.refreshToken = this.userValue?.refreshToken;
  this.userSubject.next(user);
  this.startRefreshTokenTimer();
  return data;
})
  • 你也可以在订阅这个方法时,添加额外的订阅层面错误处理:
this.authService.refreshToken().subscribe({
  next: (res) => { /* 处理成功响应 */ },
  error: (err) => { /* 订阅时的错误处理 */ }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:17:36