【问题标题】:How to propagate errors through catchError() properly?如何通过 catchError() 正确传播错误?
【发布时间】:2018-10-22 01:29:44
【问题描述】:

我写了一个函数是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 首先捕获了一个错误并将其抛出到服务的catchError(),它会抛出错误消息,因为它不是null

这样,它允许我拥有一个全局 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)
                */
            })
        )
        
    })

?

【问题讨论】:

    标签: rxjs angular-http rxjs6


    【解决方案1】:

    可以用 throw 关键字链接错误吗?

    是的,完全没问题。 rxjs 尝试捕获此类情况并将其转换为错误通知。

    我尝试返回 Observable.throwError() 但浏览器说“Observable.throwError 不是函数”

    使用 rxjs6,Observable 原型不再被修改为包含运算符或这些“创建运算符”,而是作为独立函数公开。你可以阅读更多关于它here,但它的要点是你只需return throwError(…),例如

    return source$.pipe(
      catchError(err => err.code === 404 
        ? throwError("Not found")
        : throwError(err)
      )
    )
    

    【讨论】:

    猜你喜欢
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多