web-dev-qa-db-fra.com

Comment propager correctement les erreurs via catchError ()?

J'ai écrit une fonction qui est pipe- capable:

HandleHttpBasicError<T>()
{
    return ((source:Observable<T>) => {
        return source.pipe(
            catchError((err:any) => {
                let msg = '';
                if(err && err instanceof HttpErrorResponse)
                {
                    if(err.status == 0)
                        msg += "The server didn't respond";
                }
                throw {
                    err,
                    msg
                } as CustomError
            })
        )

    })
}

Je peux utiliser cette fonction de cette façon dans mon HttpService:

checkExist(id:string)
{
    return this.http.head<void>(environment.apiUrl + 'some_url/' + id)
        .pipe(
            HandleHttpBasicError(),
            catchError((err:CustomError) => {
                if(err.msg)
                    throw err.msg;
                if(err.err.status == HttpStatusCodes.NOT_FOUND)
                    throw("It doesn't exist.");
                throw(err);
            })

        )
}

Ça marche très bien. Lorsque je m'abonne à checkExist(), je reçois un bon message d'erreur, car HandleHttpBasicError commence par capturer une erreur et la renvoie à la fonction catchError() du service, ce qui renvoie le message d'erreur car ce n'était pas null.

De cette façon, cela me permet d’avoir une catchError() globale qui gère les messages d’erreur qui seront toujours les mêmes. À l'avenir, je le ferai dans un HttpHandler, mais ce n'est pas le problème ici.

Est-il possible de chaîner les erreurs avec le mot clé throw?

J'ai essayé de retourner Observable.throwError(), mais le navigateur a dit

Observable.throwError n'est pas une fonction

Mes importations sont import {Observable, of, throwError} from 'rxjs';.

N'est-il pas préférable de faire ceci:

return ((source:Observable<T>) => {
        return source.pipe(
            catchError((err:any) => {
                msg = '';
                ...
                return of({err, msg} as CustomError)
                /* instead of
                throw(err)
                -or-
                return Observable.throwError(err) (which doesn't work)
                */
            })
        )

    })

?

15
dc-p8

Est-il possible d'enchaîner les erreurs avec le mot clé throw?

Oui, c'est tout à fait bien. Rxjs try-attrape de tels cas et le convertit en une notification d'erreur.

J'ai essayé de retourner Observable.throwError () mais le navigateur dit "Observable.throwError n'est pas une fonction"

Avec rxjs6, le prototype Observable n'est plus modifié pour contenir des opérateurs ou ces "opérateurs de création", mais ils sont exposés en tant que fonctions autonomes. Vous pouvez en lire plus à ce sujet ici , mais l'essentiel est que vous ne feriez que return throwError(…), par exemple.

return source$.pipe(
  catchError(err => err.code === 404 
    ? throwError("Not found")
    : throwError(err)
  )
)
28
Ingo Bürk