Ошибка catchError не работает при возврате ошибки 500 из web-api

#angular #exception #asp.net-web-api #rxjs #angular-errorhandler

#angular #исключение #asp.net-web-api #rxjs #angular-обработчик ошибок

Вопрос:

Попробовав более сложные сценарии, без решения я возвращаюсь к основам:

У меня есть контроллер web-api, который при возврате ошибки 500 я бы хотел, чтобы клиент ее перехватил.

По какой-то причине — этого не происходит — я, вероятно, что-то здесь упускаю.

Механизм работает идеально, когда контроллер находится в своем обычном состоянии.

При запуске этого кода в консоли я вижу: сообщение об ошибке 500 и сообщение об ошибке, в котором утверждается:«Вы предоставили недопустимый объект, где ожидался поток …».

чего мне здесь не хватает?

Это мой код (написанный вручную, не копировать вставить — игнорировать ошибки опечатки):

Контроллер специально возвращает исключение:

 public IActionResult getSomeErrorAsTest()
{
    try
    {
        /*usually it does something on the server*/
        throw new Exception("Serer error");
    }
    catch(Exception ex)
    {
        return StatusCode(StatusCodes.Status500InternalServerError, new List<string>());
        //throw ex;
    }
}
  

Служба Angular:

 export class MyService
{
    getData()
    {
        return this.httpClient.get<void>(<controller url>)
        /*not sure if this part is needed*/
        .pipe
        (
            catchError(this.handleError);
        )
    }
    
    handleError(error : HttpErrorResponse)
    {
        return Observable.throw(error.message || "server error");
    }
}
  

Потребляющий компонент:

 export class myComponent
{
    isGettingData : boolean;
    constructor (private mySrv : MyService)
    ngOnInit()
    {
        this.isGettingData = false;
    }
    public getData()
    {
        this.isGettingData = true; //This is used for indication icon in the Html, in case the server action takes few seconds 
        this.mySrv.getDataFromBackEndServer().subscribe
        (
            result => this.isGettingData = false, 
            error => {
                console.log('eror occured');
                this.isGettingData = false;
            },
            () => console.log('completed')
        );
    }
}
  

Комментарии:

1. какова цель повторного запуска ошибки в handleError ?

Ответ №1:

После множества тестов, потянув за волосы, выяснилось, что проблема заключалась в HTTP_INTERCEPTORS, которые, вероятно, «ловят» ответы об ошибках.

Ответ №2:

Это потому, что вам нужно использовать «throwError» из библиотеки rxjs, она фактически возвращает наблюдаемое значение, которое выдает ошибку

Рабочий пример:https://stackblitz.com/edit/rxjs-catcherror-http?file=src/app/test-service.service.ts

Документ о throwError :https://rxjs-dev.firebaseapp.com/api/index/function/throwError