#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