Пользовательский обработчик ошибок angular не получает тип ошибки из обещания

При выбросе из обещания каждая ошибка, которую получает мой пользовательский обработчик ошибок, теряет свой тип

import { HttpErrorResponse } from "@angular/common/http";
import { ErrorHandler, Injectable, Injector, NgZone } from "@angular/core";
import { MatSnackBar } from "@angular/material";

@Injectable()
export class GlobalErrorHandler implements ErrorHandler {

    constructor(private injector: Injector) { }

    handleError(error: any): void {
        if (error instanceof HttpErrorResponse) // this needs to be triggered
            this.injector.get(NgZone).run(() => this.injector.get(MatSnackBar).open(error.message))

        console.error(error)
    }

}

findProject (2) выдаст HttpErrorResponse, поскольку проект 2 не существует.

Работающий

this.projectService.findProject(2).subscribe()

Не работает

await this.projectService.findProject(2).toPromise()

Не работает

await this.projectService.findProject(2).toPromise().catch(error => { throw error })

Не работает

try {
  await this.projectService.findProject(2).toPromise()
} catch (e) {
  console.log(e instanceof HttpErrorResponse) // true
  throw e
}

ProjectService - это сгенерированный класс, который возвращает Observable

Изменить: это объект ошибки в методе handleError:

Error: Uncaught (in promise): HttpErrorResponse: {"headers":{"normalizedNames":{},"lazyUpdate":null},"status":404,"statusText":"OK","url":"http://localhost:9090/api/project/2","ok":false,"name":"HttpErrorResponse","message":"Http failure response for http://localhost:9090/api/project/2: 404 OK","error":{"timestamp":1534921795114,"status":404,"error":"Not Found","exception":"de.dlh.lhind.lhindquiz.controller.ResourceNotFoundException","message":"No message available","path":"/api/project/2"}}
    at resolvePromise (zone.js:814)
    at zone.js:724
    at rejected (main.js:105)
    at ...

Кажется, что обещание обертывает HttpErrorResponse вокруг обычной ошибки и ошибки. Сообщение действительно является запрошенным объектом


person DasEarl    schedule 21.08.2018    source источник
comment
Не вдаваясь в оператор if, выйдите из системы «ошибка», что там написано о типе?   -  person rrd    schedule 21.08.2018
comment
Добавлено в вопрос   -  person DasEarl    schedule 22.08.2018
comment
Есть очень похожая проблема. В потоке обещаний это не будет работать, но будет работать с потоком подписки.   -  person jpwiddy    schedule 21.09.2018


Ответы (1)


Я столкнулся с той же проблемой и наткнулся на ваш вопрос.

Кажется, вы можете исправить это (по крайней мере, в Angular 7), развернув исключение в вашем ErrorHandler, если это необходимо.

if (error.promise && error.rejection) {
    // Promise rejection wrapped by zone.js
    error = error.rejection;
}

// regular error handling code

Примечание. Я выяснил структуру объекта обертывания Error, используя console.error("%O", error) в соответствии с этим вопросом: Chrome : Вывод сведений об исключении в консоль

person curledUpSheep    schedule 22.02.2019
comment
Спасибо, у меня такая же проблема в приложении Ionic Angular Cordova, особенно в приложении для iOS. Эта строка решает проблему. Все ошибки, возникающие из неожиданного асинхронного метода, обработчик угловых ошибок улавливает и возвращает как обещание. - person D.Ragoo; 15.01.2021