处理全局Angular 4错误

时间:2017-08-17 13:16:38

标签: angular

我们需要一种方法来处理全局Angular错误,包括不正确的http调用,如401或500.

我看到有一个ErrorHandle类捕获全局Angular Exceptions,但该类没有检测到错误的(例如状态500)http调用。那么有另外一种方法来处理这两种类型的错误,或者我需要从它们创建某种委托给另一种自定义服务吗?

2 个答案:

答案 0 :(得分:0)

当您使用Angular 4时,您可以使用新的HttpClient,并为您的HTTP响应编写一个拦截器。 Angular docs for HttpClient中的更多详细信息和示例。

编辑:添加了示例

import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http'
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/do';

@Injectable()
export class ErrorInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        return next.handle(req).do(event => {}, err => {
            if (err instanceof HttpErrorResponse && err.status == 401) {
                // handle 401 errors
            }

            if (err instanceof HttpErrorResponse && err.status == 500) {
                // handle 500 errors
            }
        });
    }
}

答案 1 :(得分:-1)

当你的服务将observable返回到你调用它的任何地方时,你可以这样做:

this.myService.doSomething().subscribe(
   successfulPayload => { //do stuff with the good response },
   error => this._apiErrorHandler(error));

然后在_apiErrorHandler中,您可以将错误发送到商店,以便其他组件可以通过了解错误来执行他们需要做的任何事情。

private _apiErrorHandler(payload) {
   this.store.dispatch({ type: 'API_ERROR', payload });
}

由于这是一个api错误,你知道它会有类似状态500的代码,因此有效负载具有status属性和statusText属性(payload.status和payload.statusText)