全局处理错误
集中捕获并转换 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 反馈 — 无需本地设置。