在我的 Angular 2 应用程序中,我有一个解析守卫,它尝试 xhr 并在失败时抛出自定义错误:
return this.service.getProduct (id)
.catch (err => Observable.throw(new MyError(err.message, route, 500, err)));
MyError
只是以下的扩展Error
:
export class MyError extends Error {
constructor(message, routeSnapshot, code, err) {
super(message);
this.name = 'MyError';
this.routeSnapshot = routeSnapshot;
this.code = code;
this.err = err;
}
}
我的全局错误处理程序收到一个实例,ZoneAwareError
而不是MyError
:
export class MyErrorHandler implements ErrorHandler {
handleError(error) {
console.log('handling err', error);
// this prints a ZoneAwareError on the console
}
}
真的error
应该被包裹ZoneAwareError
吗?我如何打开它才能MyError
回来?依赖error.rejection
房产安全吗?(因为我可以看到MyError
那里)。
=== 编辑:
好的,我刚刚发现 Angular 将错误包装在不同的子类型中Error
,而不仅仅是ZoneAwareError
. 到目前为止,我有这个功能来解开它们,但感觉有点 hacky:
function unwrap (err) {
let res = err.rejection ? err.rejection : err;
while (res.originalError) {
res = res.originalError;
}
res.name = res.name || 'unknown';
return res;
}