我正在使用 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/