当我从我的自定义错误处理程序得到的每一个Error都从诺言中抛出时,它的类型就会丢失
import { HttpErrorResponse } from "@angular/common/http";
import { ErrorHandler, Injectable, Injector, NgZone } from "@angular/core";
import { MatSnackBar } from "@angular/material";
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
constructor(private injector: Injector) { }
handleError(error: any): void {
if (error instanceof HttpErrorResponse) // this needs to be triggered
this.injector.get(NgZone).run(() => this.injector.get(MatSnackBar).open(error.message))
console.error(error)
}
}
findProject(2)将抛出HttpErrorResponse,因为项目2不存在。
工作
this.projectService.findProject(2).subscribe()
不起作用
await this.projectService.findProject(2).toPromise()
不起作用
await this.projectService.findProject(2).toPromise().catch(error => { throw error })
不起作用
try {
await this.projectService.findProject(2).toPromise()
} catch (e) {
console.log(e instanceof HttpErrorResponse) // true
throw e
}
ProjectService是一个摇摇欲坠的生成类,它返回一个Observable
编辑: 这是handleError方法中的错误对象:
Error: Uncaught (in promise): HttpErrorResponse: {"headers":{"normalizedNames":{},"lazyUpdate":null},"status":404,"statusText":"OK","url":"http://localhost:9090/api/project/2","ok":false,"name":"HttpErrorResponse","message":"Http failure response for http://localhost:9090/api/project/2: 404 OK","error":{"timestamp":1534921795114,"status":404,"error":"Not Found","exception":"de.dlh.lhind.lhindquiz.controller.ResourceNotFoundException","message":"No message available","path":"/api/project/2"}}
at resolvePromise (zone.js:814)
at zone.js:724
at rejected (main.js:105)
at ...
promise似乎将HttpErrorResponse包裹在常规Error周围,并且error.message确实是请求的对象
答案 0 :(得分:1)
我刚遇到同样的问题,偶然发现了你的问题。
如果需要,您似乎可以通过在ErrorHandler中展开异常来解决此问题(至少在Angular 7中如此)。
if (error.promise && error.rejection) {
// Promise rejection wrapped by zone.js
error = error.rejection;
}
// regular error handling code
注意:我根据以下问题console.error("%O", error)
得出了包装错误对象的结构:Chrome: Print exception details to console