angular - 在订阅中捕获错误是不可能的吗?

标签 angular error-handling rxjs try-catch observable

我正在使用 Angular 7,我试图捕获抛出的错误,因为外部 api 返回的值在我期望的值处具有空值。

我似乎无法弄清楚在这种情况下我应该做什么。

我有一个调用 api 的服务。

getObjectValue(param: paramtype): Observable<ObjectValue> {
    return this.http.get<objectwithvalues>(environment.baseapiurl + '/api/object/value/'+ param);
  }

在消费组件中,我像往常一样订阅

testfunction() {
   this.service.getObjectValue().Subscribe(v => {
    *DO STUFF*
    *Error happens* v['o'] // oh no v is null
   },
    error=>{
     console.log('error') 
     this.snackbar.open('this went wrong' + error); 
    }
  );
}

这就是基本情况。
这样做不会触发 'error=>{}'
Angular 只是简单地吐出一条错误信息。

所以我在订阅回调范围内尝试了 try/catch 。没抓到。

我目前正在尝试将服务代码更改为以下内容

getObjectValue(param: paramclass): Observable<ObjectValue> {
    return this.http.get<EventWifi>(
      environment.baseapiurl + '/api/object/value/'+ param).pipe(map(v=> {
   if(v === null){
     return throwError('v is null');  
   } 
  }),
   catchError(err => this.errorTest(err))
);
  }

this.errorTest(err: any): Observable<any> {
 return throwError(err);

}


虽然在订阅者中做同样的事情,但订阅错误函数永远不会捕捉到错误,所以我无法适本地处理错误。

使用最新显示的服务功能,根本不会抛出任何错误。

我已经尝试了很多配置上的小差异,我现在几乎不记得了,所以一定有一个基本的东西我搞砸了。

我看过很多例子,但没有一个能在我的案例中找到并起作用。

最佳答案

问题是您正在尝试处理订阅功能中的错误。这永远不会达到您的错误功能,很简单,因为它不能。您应该从管道内抛出错误。最好在mergeMap :

getObjectValue(param: paramtype): Observable<ObjectValue> {
  return this.http.get(environment.baseapiurl + '/api/object/value/'+ param).pipe(
    mergeMap((v) => v == null ? throwError('v is null') : of(v)) 
  );
}

然后你可以这样做:
testfunction() {
  this.service.getObjectValue().subscribe((v) => {
    // v will never be null
  },
  (error) => {
    console.log('error') 
    this.snackbar.open('this went wrong' + error); 
  });
}

如果这在您的应用程序中经常发生,您可以创建一个 HttpInterceptor这为你做这件事。如果返回值为空,您可以让它抛出带有特定错误代码和编号的 http 调用。

关于angular - 在订阅中捕获错误是不可能的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55400372/

相关文章:

cocoa - 写入URL : error handling

javascript - 异步/等待错误处理

angular - 如何在 Angular 中设置重试调用间隔

android - 来自 SDK 的崩溃分析

angular - FormControl valueChanges.subscribe 与 keyup

javascript - 通过 forkJoin 和响应识别的并行 http 请求

javascript - 将数据从服务推送到组件的最佳方式是什么?

Angular 2 - Beta 16 @ViewChild,loadNextToLocation 试图将一个组件动态加载到另一个组件中?

javascript - 在数组中选择对象时,如果它不是空的 typescript ,则返回undefined

angular - 如何防止 bsValueChange 在页面加载时触发 Angular ?