如何 "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.