如何在HTTP 400错误时取消重试仅打印错误日志?
修改Angular RetryInterceptor实现HTTP 400错误不重试并输出日志
要实现遇到HTTP 400错误时不重试、仅输出错误信息到控制台,需要在重试逻辑中排除400状态码,并在错误捕获分支中添加日志输出,具体修改如下:
修改后的完整代码
@Injectable() export class RetryInterceptor implements HttpInterceptor { private keycloakService = inject(KeycloakService); intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> { return next.handle(request).pipe( retry({ count: 3, delay: (error, retryCount) => { // 遇到400错误直接抛出,终止重试流程 if (error.status === 400) { throw error; } if (error.status === 503 || error.status === 504) { return timer(1000); // 503/504错误固定1秒后重试 } return timer(retryCount * 1000); // 其他可重试错误使用递增延迟 } }), catchError((error) => { if (error.status === 401) { return this.handleUnauthorized(request, next); } if (error.status === 503 || error.status === 504) { // 这里可以添加503/504错误的跳转逻辑 } // 400错误输出控制台日志 if (error.status === 400) { console.error('HTTP 400错误:', error.message, error); } // 原代码中noDisplayError变量未定义,需根据实际业务补充定义或逻辑 // if (!noDisplayError) { // } throw error; }) ); } // 需确保handleUnauthorized方法已实现 private handleUnauthorized(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> { // 此处补充401错误的处理逻辑,比如刷新token后重试请求 throw new Error('handleUnauthorized method not implemented'); } }
关键修改说明
- 终止400错误的重试流程:在
retry的delay回调中,一旦检测到错误状态码为400,直接抛出错误。RxJS的retry操作符会在delay回调抛出错误时停止重试,直接进入catchError分支。 - 输出400错误日志:在
catchError中新增400错误的判断分支,使用console.error输出详细错误信息,之后抛出错误让上层处理(或根据业务需求调整是否抛出)。
注意:原代码中
noDisplayError变量未定义,需根据实际业务场景补充该变量的定义或对应的错误显示逻辑。
内容的提问来源于stack exchange,提问作者Christos Segkani
相关产品推荐
相关产品推荐

