Обработчик ошибок в Angular2

У меня вопрос по поводу нового класса ErrorHandler (включен в RC.6).

Я сделал пример из официальных документов: https://angular.io/docs/ts/latest/api/core/index/ErrorHandler-class.html

import{ErrorHandler} from "@angular/core";
import{NgModule} from "@angular/core";
export class MyErrorHandler implements ErrorHandler {

    call(error: any, stackTrace: any = null, reason: any = null) {
        // do something with the exception
        console.log("do something with the exception");
    }

    // I handle the given error.
    public handleError( error: any ): void {
        console.log("I handle the given error");
    }

}
@NgModule({
    providers: [
        {
            provide: ErrorHandler,
            useClass: MyErrorHandler
        }
     ]
})
export class MyErrorModule {}

После того, как я отредактировал файл app.module

import {MyErrorHandler} from "./error.module";
import {MyErrorModule } from "./error.module";
..
@NgModule({
    imports: [
        MyErrorModule
    ....
    ],
    ...
    providers: [MyErrorHandler]
   ....

Теперь MyErrorHandler ловит ошибки:

throw new Error("my test error");

Но он не перехватывает ошибки HTTP, такие как: «GET http://example.com/rest/user 401 (Несанкционировано)". Может ли кто-нибудь объяснить мне это?

Заранее спасибо!


person Egor    schedule 14.09.2016    source источник


Ответы (2)


Для обработки ошибок HTTP добавьте оператор .catch() к наблюдаемому

return this.http.get(url,options)
    .catch((res)=>this.handleHTTPError(res));

Функция будет вызываться, когда HTTP-вызов возвращает код состояния в диапазоне 4-500. Оттуда вы можете сбросить ошибку, как хотите

handleHTTPError(res:Response){
    throw new Error("HTTP error: "+res.statusText+" ("+res.status+")");
}
person BeetleJuice    schedule 14.09.2016
comment
Есть ли способ обрабатывать ошибки HTTP с помощью специального обработчика ошибок/службы? Причина, по которой я спрашиваю, заключается в том, что у меня много сервисов, и многие из них имеют HTTP-вызовы. Я хотел бы иметь возможность объявить один метод handletHTTPError - person Kosmonaft; 16.09.2016
comment
поэтому лучше пусть перехватчик ошибок отслеживает ошибки http. он также может отслеживать обычные ошибки от служб. - person netalex; 21.05.2019

Строго говоря, 401 (или что-то еще в этом отношении) не совсем ошибка. Это просто код возврата HTTP. Вам нужно справиться с этим самостоятельно, если такой код нарушает функциональность вашего приложения. Но есть настоящие ошибки, такие как ошибка подключения, с которыми я также хотел бы знать, как справляться. Вот мой вопрос об этом: http-сервис Angular 2 http. Получить подробную информацию об ошибке

person rook    schedule 14.09.2016