【发布时间】:2019-05-21 00:16:57
【问题描述】:
嗨,我正在使用 Angular 5,我正在为它编写一个全局处理程序,如下所示。
@Injectable()
export class ErrorsHandler implements ErrorHandler {
constructor(
private injector: Injector,
) { }
handleError(error: Error | HttpErrorResponse) {
const router = this.injector.get(Router);
const zone = this.injector.get(NgZone);
console.log('Here')
console.log(error)
if (error instanceof HttpErrorResponse) {
// Client Error Happend
zone.run(() => router.navigate(['/error'], { queryParams: { error: JSON.stringify(error) } }))
} else {
// Log the error anyway
router.navigate(['/error'], { queryParams: { error: JSON.stringify({ message: 'Failed' }) } });
}
}
}
在 Observable 世界中一切正常,即如果我执行失败的 http 调用,如下所示
fireServerError() {
this.httpService
.get('https://jsonplaceholder.typicode.com/1')
.subscribe(data => console.log('Data: ', data));
}
如果服务器调用失败,我会正确地得到一个错误对象,如控制台图像所示
但是,如果我使用 toPromise() 将其更改为承诺,而不是像下面这样
fireServerError() {
this.httpService
.get('https://jsonplaceholder.typicode.com/1')
.toPromise();
}
我得到以下字符串堆栈跟踪而不是错误对象本身
我做错了什么。在未处理的承诺拒绝的情况下如何抛出/获取错误对象。请帮忙。我被卡住了;
请找到stackblitz链接Here
【问题讨论】:
-
您是否尝试过类似以下的操作:
fireServerError() { this.httpService.get('https://jsonplaceholder.typicode.com/1').toPromise().catch(err => console.error(err)); } -
是的,但我不想吞下 catch 块中的错误,而是重新抛出它,以便全局错误处理程序处理它。我附上了 stackblitz 链接来解决这个问题。
-
如果在 catch 中,您确实返回了一个新的已解决承诺,错误为
Promise.resolve(err)? -
再次被吞没,除非你再次抛出它以便全局处理程序可以处理它。
标签: javascript angular angular5