web-dev-qa-db-ja.com

catchError()を介して適切にエラーを伝播する方法は?

pipe- ableである関数を作成しました。

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
            })
        )

    })
}

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);
            })

        )
}

うまく機能しています。 checkExist()をサブスクライブすると、HandleHttpBasicErrorが最初にエラーをキャッチし、nullではないためエラーメッセージをスローするサービスのcatchError()にスローするため、適切なエラーメッセージが表示されます。

このようにして、常に同じになるエラーメッセージを処理するグローバルcatchError()を持つことができます。将来的には、HttpHandlerで実行しますが、それはここでのポイントではありません。

throwキーワードでエラーを連鎖させても大丈夫ですか?

Observable.throwError()を返そうとしましたが、ブラウザは言いました

Observable.throwErrorは関数ではありません

私のインポートはimport {Observable, of, throwError} from 'rxjs';です。

これを行うのは良いことではありませんか:

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

Throwキーワードでエラーを連鎖させても大丈夫ですか?

はい、それはまったく問題ありません。 rxjsはそのような場合をキャッチし、エラー通知に変換します。

Observable.throwError()を返そうとしましたが、ブラウザは「Observable.throwErrorは関数ではありません」と言います。

Rxjs6では、Observableプロトタイプは、演算子またはこれらの"作成演算子"を含むように変更されなくなり、代わりにスタンドアロン関数として公開されます。あなたはそれについてもっと読むことができます ここ 、しかしそれの要点はあなたがただreturn throwError(…)したいということです。

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