如何 "unwrap" ZoneAwareError?
How to "unwrap" a ZoneAwareError?
在我的 Angular 2 应用程序中,我有一个 resolve guard,它尝试 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;
}
您可以看到 Angular 本身是如何解包的: angular/modules/@angular/core/src/error_handler.ts,但是它们似乎无法以任何方式处理 rejection
(这非常有用)所以我在展开之前使用以下内容:
if(error.hasOwnProperty('rejection'))
{
error = error.rejection;
}
UncaughtPromiseError 接口在 zone.js.
在我的 Angular 2 应用程序中,我有一个 resolve guard,它尝试 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;
}
您可以看到 Angular 本身是如何解包的: angular/modules/@angular/core/src/error_handler.ts,但是它们似乎无法以任何方式处理 rejection
(这非常有用)所以我在展开之前使用以下内容:
if(error.hasOwnProperty('rejection'))
{
error = error.rejection;
}
UncaughtPromiseError 接口在 zone.js.