gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 07:38:40 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com