javascript - Angular try catch 与捕获错误

标签 javascript angular typescript ecmascript-6 rxjs

对于一个 Angular 项目,我得到一个包含所有 api 路径列表(发现路径)的 url。
在我的应用程序中,我想调用发现路径并将结果保存在列表中。
我的代码:

discover(): Observable<ApiLink[]> {
    if (this.links) {
      return of(this.links);
    }
    try {
      console.log('calling :', URL);
      return this.http.get<{links: ApiLink[]}>(URL, {headers: this.headers}).pipe(
        map(response => {
          this.links = response.links;
          return this.links;
        }),
        catchError(some_error => {
          console.log('error ', some_error);
          throw new Error('failed to discover the api.');
        }),
      );
    } catch (e) {
      console.log('api discover failed ', e);
      throw new Error('failed to discover the api.');
    }
  }

我的问题是它什么时候去 catchError 以及什么时候去捕捉?如果调用成功但返回错误 500,它是否会发生 catcherror 是它会发生 catchError 还是有效响应(调用工作正常)?以及调用方法应该如何处理可能的错误。当我使用 catcherror 调用时是否正确:
  // we give a string that relates to a path e.g. 'user' returns someurl.com/api/users
  url(rel: string, params?: object): Observable<string> {
    return this.discover().pipe(
      map(links => {
        const link = links.find(item => item.rel === rel);
        if (link) {
          return link.href;
        } else {
          throw new Error(`IXapi entry "${rel}" was not found.`);
        }
      }),
      catchError( errormessage => {
        console.log('error inside url ', rel, ' error:', errormessage);
        throw errormessage;
      })
    );
  }

还是应该尝试一下。
  url(rel: string, params?: object): Observable<string> {
    console.log('url: ', rel);
    try{
    return this.discover().pipe(
     // do stuff
    );
    }catch(e)
     {
       console.log('do some stuff because we have an error');           
       throw e;
     }
  }

简而言之,什么时候应该使用 try/catch 与 catcherror,我应该如何从调用方法中捕获在 catcherror/try catch 中抛出的错误?

最佳答案

在同步编程中,我们使用传统的 try catch block 来捕获抛出的任何错误。

try {
   // synchronous operation
   const httpResponse =  getHttpResponseSync('/api/getUsers');
}
catch(error) {
    // handle error
}

但是当它像 HTTP 请求这样的异步编程时,我们不能依赖这个 try catch block ,

所以 Rxjs 为这个 catchError 提供了一个函数,该函数接受一个输入 Observable,并输出一个 Output Observable。

该函数预计将返回一个 Observable,它将成为刚刚出错的流的替换 Observable。

根据你的第一个问题!
它总是会去 catchError 因为 http.get 一个 observable 使它异步

引用 https://www.intertech.com/Blog/angular-best-practice-rxjs-error-handling/

关于javascript - Angular try catch 与捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59245729/

相关文章:

javascript - 使用 supertest 和 Express JS 测试 next(err)

javascript - View 未使用 require.js 文本呈现!插入

forms - Angular2 react 形式选择多个属性?

angular - Mat-chip-list 的电子邮件验证

javascript - 类型错误 : Object prototype may only be an Object or null: undefined

javascript - 如何将外部 css 导入到 typescript 元素中

javascript - 如何在 ItemView 的 className 中获取模型属性?

javascript - Android Phonegap 滚动条非常不稳定

css - 如何使用 Angular CLI 添加应用程序范围的 CSS 文件?

Typescript 不相信一定会在对象中创建属性