我有一个带有globalError处理程序的应用程序,
import { Injectable, ErrorHandler, Injector } from "@angular/core";
import { Router } from "@angular/router";
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
constructor(
private injector: Injector) { }
public handleError(error: any) {
console.error("Something went wrong");
//.. Handle error here
}
}
这总是适用于所有场合。如果引发了错误,全局处理程序将捕获并处理该错误。
现在升级到RxJs 6.2.2后,我了解到捕获http错误已更改。
代码错误仍然可以解决,但是HttpClient抛出的错误不会被全局捕获。不再触发GlobalErrorHandler。
我知道我可以处理服务中的错误,并且可以像这样正常工作:
doSomething() {
return this.http
.get("http://someURL").pipe(
map((res: any) => { console.log(res) }),
catchError(this.handleError<any>(`blabla`))
);
}
/**
* Handle Http operation that failed.
* Let the app continue.
* @param operation - name of the operation that failed
* @param result - optional value to return as the observable result
*/
private handleError<T>(operation = 'operation', result?: T) {
return (error: any): Observable<T> => {
console.log("Now throwing error");
// TODO: send the error to remote logging infrastructure
console.error(error); // log to console instead
// Let the app keep running by returning an empty result.
// ToDo: Global Error handler hier aufrufen....
return of(result as T);
};
}
但是我实际上想集中处理所有错误。
Angular 6和RxJs 6集中处理错误的正确方法是什么?
答案 0 :(得分:2)
你尝试过吗?在我当前的Angular 6应用程序中,当没有其他人捕获到不良的HTTP结果时,将调用全局ErrorHandler。然后,事件遍历整个流,运行到订阅回调中,没有找到错误函数,然后直接进入全局错误处理。
所以对我来说效果很好。 (Angular 6.0.9,RXJS 6.2.1)
我个人非常喜欢在大多数情况下使用特定的rxjs错误捕获。 它允许特定的响应。对于某些HTTP错误,我想尝试重试,对于某些默认值,可以使用默认值,对于某些HTTP错误,我必须提高红色标志,让应用程序死于美丽的死亡。
最好的是,您可以在靠近呼叫的地方捕获错误,进行处理(例如重试或返回默认值),并且订户甚至希望意识到存在错误处理活动。
我正在使用全局ErrorHandler,它的catchAll逻辑主要只是作为防御的最后一道防线。
热烈的问候