0Pricing
Angular Academy · 课时

全局处理错误

集中捕获并转换 HTTP 错误

全局处理错误 是 CoddyKit 上的免费 Angular Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Angular Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Angular Academy 课程共包含 4 节课。

集中处理错误

拦截器可以全局处理 HTTP 错误,而不是在每个组件中捕获错误:记录日志、显示提示、在 401 时重定向,或统一错误结构。

拦截器中的 catchError

将 next(req) 流通过 catchError 管道传递,以拦截失败。

import { catchError, throwError } from 'rxjs';
import { HttpErrorResponse } from '@angular/common/http';

export const errorInterceptor: HttpInterceptorFn = (req, next) =>
  next(req).pipe(
    catchError((err: HttpErrorResponse) => {
      console.error('HTTP error', err.status);
      return throwError(() => err);
    })
  );

检查 HttpErrorResponse

HttpErrorResponse 包含 status、message 和服务器的 error 响应体。根据状态处理不同情况。

catchError((err: HttpErrorResponse) => {
  if (err.status === 0) console.error('network/CORS error');
  else console.error('server error', err.status);
  return throwError(() => err);
})

在 401 时重定向

401 通常表示会话已过期。请从拦截器重定向到登录页面。

export const errorInterceptor: HttpInterceptorFn = (req, next) => {
  const router = inject(Router);
  return next(req).pipe(
    catchError((err: HttpErrorResponse) => {
      if (err.status === 401) router.navigate(['/login']);
      return throwError(() => err);
    })
  );
};

显示通知

注入提示或通知服务,以一致地向用户呈现错误。

export const errorInterceptor: HttpInterceptorFn = (req, next) => {
  const toast = inject(ToastService);
  return next(req).pipe(
    catchError((err: HttpErrorResponse) => {
      toast.error(err.error?.message ?? 'Something went wrong');
      return throwError(() => err);
    })
  );
};

重新抛出还是吞掉错误

通常应使用 throwError(() => err) 重新抛出错误,以便组件仍能做出响应。只有在确实希望向调用方隐藏错误时,才返回备用可观察对象(例如 of(null))。

统一错误结构

在重新抛出之前,将各种服务器错误响应体映射为一致的应用错误结构,从而简化后续处理。

catchError((err: HttpErrorResponse) => {
  const appError = {
    code: err.status,
    message: err.error?.message ?? err.message
  };
  return throwError(() => appError);
})

区分客户端错误与服务器错误

err.error instanceof ErrorEvent(或 err.status === 0)表示客户端或网络错误;否则表示后端返回了错误状态。请分别处理这两类错误。

避免重复处理

如果拦截器已经显示提示,组件就不应再针对同一错误显示提示。请确定一个面向用户的处理层,以避免重复消息。

将日志记录到监控服务

集中式拦截器是将错误转发到监控工具(Sentry 等)的理想位置,同时附带请求上下文。

export const errorInterceptor: HttpInterceptorFn = (req, next) => {
  const monitor = inject(MonitoringService);
  return next(req).pipe(
    catchError((err: HttpErrorResponse) => {
      monitor.captureHttpError(req.url, err.status, err.message);
      return throwError(() => err);
    })
  );
};

安排错误拦截器的顺序

放置错误拦截器,使其包装其他拦截器,从而捕获整个链中的错误(包括重试产生的错误)。

provideHttpClient(
  withInterceptors([authInterceptor, retryInterceptor, errorInterceptor])
)

快速检查

测试您对全局错误处理的理解。

回顾:全局处理错误

错误拦截器集中处理 HTTP 失败。

  • 在 next(req) 上使用 catchError。
  • 根据 HttpErrorResponse.status 进行分支处理(例如在 401 时重定向)。
  • 重新抛出错误,让组件做出响应;只有在有意为之时才吞掉错误。

下一步:重试和加载指示器。

常见问题解答

「全局处理错误」课时是免费的吗?

是的 — 「全局处理错误」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Angular Academy 课程的其余内容,请升级到 CoddyKit PRO。 Angular Academy 课程共包含 4 节课。

「全局处理错误」这节课中我会学到什么?

集中捕获并转换 HTTP 错误 你通过在浏览器中直接运行的动手代码来练习 Angular Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Angular Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Angular Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「全局处理错误」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Angular Academy 课中编写并运行代码吗?

能。每节 Angular Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 函数式拦截器
  2. 添加身份验证标头
  3. 全局处理错误
  4. 重试与加载指示器
← 返回 Angular Academy