Angular 角度ErrorHandler和HttpErrorResponse
今天,我决定进一步研究Angular应用程序的一些集中式错误报告。我使用了michaelkarén()的一篇关于Medium的伟大文章,解释了如何处理客户端和服务器端问题并记录它们 在我的示例项目中,我有一个非常简单的拦截器:Angular 角度ErrorHandler和HttpErrorResponse,angular,angular-http-interceptors,angular-errorhandler,Angular,Angular Http Interceptors,Angular Errorhandler,今天,我决定进一步研究Angular应用程序的一些集中式错误报告。我使用了michaelkarén()的一篇关于Medium的伟大文章,解释了如何处理客户端和服务器端问题并记录它们 在我的示例项目中,我有一个非常简单的拦截器: export class HttpInterceptor implements NgHttpInterceptor { constructor( private auth : AuthService ) { } intercept(request :
export class HttpInterceptor implements NgHttpInterceptor {
constructor(
private auth : AuthService
) { }
intercept(request : HttpRequest<any>, next : HttpHandler) : Observable<HttpEvent<any>> {
return next.handle(request)
.pipe(
retry(1),
catchError((error : HttpErrorResponse) => {
return throwError(error);
})
);
}
}
是的,到目前为止它还不是真正的日志记录,但这不是一个问题。然而,我注意到,当使用Angular的HttpClient
时,或者1)使用toPromise()
方法而不是订阅,或者2)订阅响应时的错误,错误处理程序会说HttpErrorResponse的错误实例
为false。所以
这将正确记录“服务器”:
this.httpClient.get('foo').subscribe()
this.httpClient.get('foo').subscribe(
data => console.log,
error => console.error
)
await this.httpClient.get('foo').toPromise()
这将错误地记录“客户端”:
this.httpClient.get('foo').subscribe()
this.httpClient.get('foo').subscribe(
data => console.log,
error => console.error
)
await this.httpClient.get('foo').toPromise()
这也会错误地记录“客户端”:
this.httpClient.get('foo').subscribe()
this.httpClient.get('foo').subscribe(
data => console.log,
error => console.error
)
await this.httpClient.get('foo').toPromise()
由于我完全无法理解这里到底发生了什么以及为什么会出现问题,请有人帮助我正确报告HTTP错误?我正在考虑将这些错误记录在HttpInterceptor中,但是当抛出它们时,ErrorHandler会将它们作为客户端错误再次记录
我为什么要使用回调
回调的使用主要是因为所有这些调用都在各自的服务中。例如,用户服务从端点获取数据,对数据执行某些操作,然后解析承诺(或者完成观察者,不管什么)
编辑:
我已经创建了一个StackBlitz示例来说明问题:我已经检查了您的StackBlitz示例。如果您在
httpbreaked2
中处理错误时遇到问题,请修改代码以捕获错误并将其抛出GlobalHandler-
httpBroken2() {
this.httpClient.get(this.randomUrl()).pipe(catchError((errors: HttpErrorResponse) => {
// anything you want to do (i.e. modify error)
return throwError(errors);
})).subscribe(
(data) => {
alert(data);
}
)
}
有点太健谈了,我希望避免整个扔它的事情再次发生,但我想这很容易:)谢谢!欢迎:)。如果您不想在发生错误时执行任何操作,则不需要捕获错误。它将在AppErrorHandler中自动处理。因此,在RXJS中,当在observable上使用catch时,它显然可以防止错误冒泡(如try{..}catch(){..}block)。了解这一点非常有用